SSRF (Server-Side Request Forgery 服务端请求伪造)
文章目录
- 0x01 是什么?
- 0x02 怎么判断是否存在SSRF漏洞?
- 0x03 防御
- 0x04 绕过手段
0x01 是什么?
是什么?
答:攻击者构造请求,由服务端(向内网 / 目的url)发起各种请求的过程。
目的是什么?
答:内网信息收集。渗透攻击
为什么存在?
原理:
大多是由于服务端提供了从自身/其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。
可以做什么工作?
1.进行端口扫描,资源访问
2.指纹信息识别,访问相应的默认文件
3.利用漏洞或者和payload进一步运行其他程序
4.get类型漏洞利用,传参数实现攻击
5.post型漏洞利用,用gopher协议进行参数构造
6.拒绝服务攻击(访问大文件占用资源)
7.利用file协议,访问/下载
8进行跳板
0x02 怎么判断是否存在SSRF漏洞?
代码审查:对服务端的源代码进行审查,检查是否存在未经验证或过滤的请求函数。手动审查代码,查看是否所有URL输入都经过了验证。
抓包分析:通过抓包工具(如Wireshark、tcpdump等)分析发送的请求是否是由服务器端发送的。如果发现请求是由服务器端发起的,则可能存在SSRF漏洞。
页面源码检查:在页面源码中查找访问的资源地址。如果资源地址类型为www.baidu.com/xxx.php ?image=等形式,则可能存在SSRF漏洞。
使用自动化工具:使用SSRF漏洞检测工具(如SSRFire)来自动扫描和发现潜在的SSRF漏洞。这些工具可以帮助研究人员快速识别目标域名和服务器信息中的潜在漏洞。
DNS带外测试:在无回显的情况下,可以使用DNS带外测试工具(如DNSlog)来测试是否存在SSRF漏洞。
排除法:通过浏览器的开发者工具(F12)查看源代码,看是否是在本地进行了请求。如果资源地址类型为http://www.xxx.com/a.php ?image=等形式,则可能存在SSRF漏洞。
利用特定协议:通过利用file、gopher、dict等协议读取本地文件或执行命令,来探测是否存在SSRF漏洞。
如:
url=dict://192.168.1.1:80
url=file:///c:/1.txt
file= file:///c:/1.txt
0x03 防御
URL的限制和过滤:基于黑名单和白名单
限制协议为HTTP/HTTPS
禁止30X跳转
设置URL白名单或者限制内网IP(使用gethostbyname()判断是否为内网IP
服务端开启OpenSSL无法交互利用
服务端需要认证交互
把用于取外网资源的API部署在不属于自己的机房
过滤返回信息,验证远程服务器对请求的响应是比较容易的方法。如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。
限制请求的端口为http常用的端口,比如 80、443、8080、8090
统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。
0x04 绕过手段
任何一种绕过,关键的问题都是“开发和测试的认知范围”问题,具体到SSRF则是对于IP和URL地址的编码和解析问题:
攻击本地:直接攻击本地系统,利用本地资源进行攻击。
利用[::]:使用IPv6地址中的双冒号“[::]”来绕过某些过滤机制。
利用@:通过在URL中添加“@”符号来绕过某些过滤器。 http://localhost/pikachu-master/vul/ssrf/ssrf_fgc.php
利用短地址:使用短地址服务来绕过URL长度限制。
利用特殊域名:使用特殊的域名或协议来绕过过滤器。
利用DNS解析:通过DNS解析来绕过某些过滤机制。
利用上传:通过上传文件来绕过某些过滤器。
利用Enclosed:通过将请求封装在特定格式中来绕过过滤器。
DNS欺骗:通过DNS欺骗来绕过某些过滤器。
使用进制编码:通过十六进制、八进制等编码方式来绕过过滤器。
添加端口:通过在URL中添加端口号来绕过某些过滤器。