SSRF
服务器端请求伪造,服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格的过滤和限制,导致攻击者可以传入任意的地址来让后端服务器对其发送请求。

前端用户可以输出任意 URL 到后端服务器,而服务器没有对其 URL 进行严格的过滤和校验,导致攻击者可以构造一些恶意的 URL 让服务器去访问执行;

主要影响
- 读取服务器本地文件;
- 探测内网存活主机和开放端口;
- 攻击其他内网服务器及服务;
(绕过 CDN 来查找真实 IP;)
探测业务功能点
- 社交分享功能:获取超链接的标题等内容进行显示;
- 转码服务:通过 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、display、sourceURl、imageURL、domain;
伪协议利用
http://:Web 常见访问,如http://127.0.0.1;file:///:从文件系统中获取文件内容,如file:///etc/passwd;dict://:字典服务器协议,访问字典资源,如dict:///ip:6739/info:;sftp://:SSH 文件传输协议或安全文件传输协议;ldap://:轻量级目录访问协议;tftp://:简单文件传输协议;gopher://:分布式文档传递服务,可使用 gopherus 生成 payload;由于有部分协议 http 这类不支持,可以 gopher 来进行通讯(mysql,redis 等);
限制及绕过方式
- 限制
http://www.xxx.com的域名;
采用 http 基本身份认证的方式进行绕过,即 @;
eg:http://www.xxx.com@www.xxyy.com
标准 URL 格式:
协议://用户名:密码@域名/路径;这里
www.xxx.com被当作用户名,而www.xxyy.com是实际的域名;
绕过正则匹配之类的限制;
- 限制请求 IP 不能为内网地址;
短网址绕过、域名解析、进制转换、3XX 重定向;
以 127.0.0.1 为例:
对限制的 IP 进行编码(十六进制、八进制、十进制等【不仅编码数字,有时需要对中间的 . 也进行编码】);
绕过 localhost 简写为 127.1;或 127.127.127.127;或 0;或 0.0.0.0;
域名解析 IP:将攻击者的域名网站对应的域名解析在服务器上配置域名解析为 127.0.0.1;eg:test.hello.com -> 127.0.0.1;此时,发送请求目标为 test.hello.com ,目标网站会请求 127.0.0.1;
重定向解析绕过:攻击者网站 xx.php:<?php header("Location:http://127.0.0.1/flag.php");;发送请求目标为 test.hello.com/xx.php;
漏洞防御
- 过滤返回信息,验证远程服务器对请求的响应是比较容易的方法;
- 统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态;
- 限制请求的端口为 http 常用的端口,比如,80,443,8080,8090;
- 黑名单内网 ip;避免应用被用来获取获取内网数据,攻击内网;
- 禁用不需要的协议;仅仅允许 http 和 https 请求。可以防止类似于
file:///、gopher://、ftp://等引起的问题;
这里以国光的 ssrf 靶场为例:

攻击流程,172.150.23.21 这个服务器的 Web 80 端口存在 SSRF 漏洞,并且 80 端口映射到了公网的 9080,此时攻击者通过这个 9080 端口可以借助 SSRF 漏洞发起对 172 目标内网的探测和攻击;
其中一个示例:172.150.23.24 页面 ping 执行系统命令;
当请求内网地址 172.150.23.24 时,需要让服务器/原目标主机触发该 ping 数据包(自己直接在该页面 ping 是失效的);由于该数据包是 post 请求;post 需要转为 gopher 协议;gopher://ip:port/_xxxxxx 来触发 172.159.23.24 rce 漏洞数据包;
(不可能通过 http://172.159.23.24/?ip=127.0.0.1;cat /flag 这样的请求是不能触发 post 请求来发包;所以需要上方所提到的这种方式来提交;)
一种玩法:有哪种在线加载 HTML 页面功能的站或是对输入的内容会自动解析为 HTML 标签来处理,这样可以通过 iframe 标签来期望页面直接回显出目标内网的内容;eg:"<iframe src=\"http://127.0.0.1\">";
可以利用 HaE 和 Auto-SSRF 插件配合使用自动化的检测漏洞;
参考学习:
https://mp.weixin.qq.com/s/99pPa1jrLR1t7_x40eH8TQ (Auto-SSRF 插件搜索配置)









