SSRF漏洞
1、SSRF漏洞简介
SSRF(服务器端请求伪造)是一种由攻击者构造特殊形成的请求,并且由指定服务器端发起恶意请求的一个安全漏洞。 一般情况下,SSRF漏洞的攻击目标是攻击者无法直接访问的内网系统。
SSRF漏洞大多是由于服务端提供从其它服务器应用获取数据的功能而没有对目标地址做过滤和限制。
2、SSRF漏洞常见位置
-
社交分享功能:获取超链接的标题等内容进行显示
-
转码服务:通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览
-
在线翻译:给网址翻译对应网页的内容
-
图片加载/下载:富文本编辑器中的点击下载图片到本地、通过URL地址加载或下载图片
-
图片/文章收藏功能:主要其会取URL地址中title以及文本的内容作为显示以求一个好的用具体验
-
云服务厂商:它会远程执行一些命令来判断网站是否存活等,所以如果可以捕获相应的信息,就可以进行SSRF测试
-
网站采集、抓取的地方:一些网站会针对输入的URL进行一些信息采集工作
-
数据库内置功能:数据库的mongodb的copyDatabase函数等
-
邮件系统:接收邮件服务器地址
-
编码、属性信息、文件处理:ffpmg,ImageMagick,docx,pdf,xml处理器等
-
未公开的API实现以及其它扩展调用URL的功能:可以利用google语法加上这些关键字去寻找SSRF漏洞。
-
URL关键字:share、wap、url、link、src、source、target、u、3g、display、sourceURl、imageURL、domain……
-
-
从远程服务器请求资源
3、SSRF漏洞用途
-
内外网的端口和服务扫描
-
主机本地敏感数据的读取
-
内外网主机应用程序漏洞的利用
-
内外网web站点漏洞的利用
4、SSRF常见函数
php函数(函数在调用期间,攻击者可任意控制传递进来的参数造成危害):
file_get_contents()
file_get_contents() 函数是用来将文件的内容读入到一个字符串中的首选方法
fsockopen()
fsockopen() 函数打开一个网络连接或者一个Unix套接字连接
curl_exec()
curl_exec() 执行一个 curl 会话
SoapClient()
SoapClient() 类为SOAP 1.1,SOAP 1.2服务器提供客户端。它可以在 WSDL 或非 WSDL 模式下使用。
5、SSRF漏洞验证方法
1)通过抓包分析发送的请求是否是由服务器发送的,从而来判断是否存在SSRF漏洞。
2)在页面源码中查找访问的资源地址 ,资源地址类型为www.baidu.com/xxx.php?image=(地址)
可能存在SSRF漏洞
6、SSRF漏洞利用
6.1 HTTP/HTTPS协议
当前应用获取用户传递过来的URL参数后端发送请求,并且将最终的请求结果返回到HTML前端页面。
http://[IP]/xxx.php?url=[IP]
http://[IP]/xxx.php?url=[IP]
SSRF漏洞服务器所在的内网大小、互通的网段,限制了当前能够获取到资源的数量。
如果服务器端对请求资源的协议做了限制,可以通过HTTPS协议进行绕过。
6.2 file协议
服务器端对请求资源所使用的协议方式没有进行限制就可以通过file协议访问当前服务器的本地文件
http://[IP]/xxx.php?url=file:///[路径]
6.3 dict协议
通过dict协议可以远程访问一个指定的tcp端口,并且会返回端口所提供的服务的部分组件信息
当目标端口开放(有服务信息显示,但会报错):
http://[IP]/xxx.php?url=dict://[IP]:[端口]
当目标端口关闭(无任何显示):
http://[IP]/xxx.php?url=dict://[IP]:[端口]
通过差异的对比,可确认内网端口开放情况。
6.4 Gopher协议
Gopher 协议是 HTTP 协议出现之前,在 Internet 上常见且常用的一个协议。现在 Gopher 协议已经慢慢淡出历史。
Gopher 协议在 SSRF 中发挥重要作用。利用此协议可以攻击内网的FTP、Telnet、Redis、Memcache,也可以进行 GET、POST 请求。
利用gopher协议可以getshell,使用ssrf漏洞结合gopher协议可以攻击内网redis。
7、防御
-
禁用不需要的协议(如:file:///、gopher://,dict://等),仅允许HTTP和HTTPS请求
-
统一错误信息,防止根据错误信息判断端口状态
-
禁止302跳转,或每次跳转都检查新的Host是否是内网IP,直到抵达最后的网址
-
设置URL白名单或者限制内网IP