(本文仅为平时学习记录,若有错误请大佬指出,如果本文能帮到你那我也是很开心啦)
- 本文参考https://xz.aliyun.com/t/2115#toc-2,十分感谢!
一、概念
SSRF全称为Server-side Request Fogery,中文含义为服务器端请求伪造,漏洞产生的原因是服务端提供了能够从其他服务器应用获取数据的功能,比如从指定的URL地址获取网页内容,加载指定地址的图片、数据、下载等等。
一般情况下,我们服务端请求的目标都是与该请求服务器处于同一内网的资源服务,但是如果没有对这个请求的目标地址、文件等做充足的过滤和限制,攻击者可通过篡改这个请求的目标地址来进行伪造请求。
二、漏洞可能出现的地方
1.社交分享功能:获取超链接的标题等内容进行显示
2.转码服务:通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览
3.在线翻译:给网址翻译对应网页的内容
4.图片加载/下载:富文本编辑器中的点击下载图片到本地;通过URL地址加载或下载图片
5.图片/文章收藏功能:主要其会取URL地址中title以及文本的内容作为显示以求一个好的用具体验
6.云服务厂商:它会远程执行一些命令来判断网站是否存活等,所以如果可以捕获相应的信息,就可以进行ssrf测试
7.网站采集、网站抓取的地方:一些网站会针对你输入的url进行一些信息采集工作
8.数据库内置功能:MongoDB的copyDatabase函数
9.邮件系统:接收邮件服务器地址
10.编码处理, 属性信息处理,文件处理:ffpmg、ImageMagick、docx、pdf、xml处理器等
11.未公开的api实现以及其他扩展调用URL的功能:可以利用Google 语法加上这些关键字去寻找SSRF漏洞
(一些的URL中的关键字:share、wap、url、link、src、source、target、u、3g、display、sourceURl、imageURL、domain……)
12.从远程服务器请求资源:upload from url 如discuz!;import & expost rss feed 如web blog;使用了xml引擎对象的地方 如wordpress xmlrpc.php
13.头像处:某易就喜欢远程加载头像,例如:http://www.xxxx.com/image?url=http://www.image.com/1.jpg
14.邮件系统:比如接收邮件服务器地址
三、漏洞验证
1.浏览器f12查看源代码看是否是在本地进行了请求
- 该资源地址类型为 http://www.xxx.com/a.php?image=(地址)的就可能存在SSRF漏洞
2.DNSLog等工具进行测试,看是否被访问
- 可以在盲打后台用例中将当前准备请求的uri 和参数编码成base64,这样盲打后台解码后就知道是哪台机器哪个cgi触发的请求
3.抓包分析发送的请求是不是由服务器的发送的,如果不是客户端发出的请求,则有可能是,接着找存在HTTP服务的内网地址
- 从漏洞平台中的历史漏洞寻找泄漏的存在web应用内网地址
- 通过二级域名暴力猜解工具模糊猜测内网地址
- 通过file协议读取内网信息获取相关地址
4.直接返回的Banner、title、content等信息
5.留意布尔型SSRF,通过判断两次不同请求结果的差异来判断是否存在SSRF,类似布尔型SQL盲注方法
四、利用方式
1.让服务端去访问相应的网址
2.让服务端去访问自己所处内网的一些指纹文件来判断是否存在相应的cms
3.可以使用file、dict、gopher、ftp协议进行请求访问相应的文件
- dict:探测内网服务
1 ?url=dict://10.10.10.130:6379 2 ?url=dict://127.0.0.1:6379/info(redis的相关配置)
- file:获取(读取)当前服务器中的文件
?url=file:///etc/passwd
- http/s:执行HTTP请求或HTTPS请求
?url=http://10.10.10.129/
- php协议:可以在file_get_contents中应用
?url=php://filter
- gopher:反弹SHELL,参考https://joychou.org/web/phpssrf.html
4.攻击内网web应用:可以向内部任意主机的任意端口发送精心构造的数据包{payload}
5.攻击内网应用程序:利用跨协议通信技术
6.判断内网主机是否存活:方法是访问看是否有端口开放
7.DoS攻击:请求大文件,始终保持连接keep-alive always
五、绕过技巧
1.http://baidu.com@www.baidu.com/ >>> http://www.baidu.com/
2.各种IP地址的进制转换
1 可以是十六进制,八进制等,115.239.210.26 >>> 16373751032 2 首先把这四段数字给分别转成16进制,结果:73 ef d2 1a 3 然后把 73efd21a 这十六进制一起转换成8进制 4 记得访问的时候加0表示使用八进制,十六进制加0x
3.URL跳转绕过:http://www.hackersb.cn/redirect.php?url=http://192.168.0.1/
4.短网址绕过:http://t.cn/RwbLKDx
5.xip.io来绕过:http://xxx.192.168.0.1.xip.io/ >>> 192.168.0.1 (xxx 任意)
6.限制子网段,加80端口绕过
7.探测内网域名,或者将自己的域名解析到内网ip
8.利用句号:127。0。0。1 >>> 127.0.0.1
六、修复
1.禁止跳转
2.过滤返回信息,验证远程服务器对请求的响应是比较容易的方法。如果web应用是去获取某一种类型的文件,那么在把返回结果展示给用户之前先验证返回的信息是否符合标准
3.禁用不需要的协议,仅仅允许http和https请求,可以防止类似于file://, gopher://, ftp:// 等引起的问题
4.设置URL白名单或者限制内网IP(使用gethostbyname()判断是否为内网IP)
5.限制请求的端口为http常用的端口,比如 80、443、8080、8090
6.统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态