1. 漏洞简介
1.1 什么是SSRF
SSRF(Server--Side Request Forgery)服务器端请求伪造即由攻击者构造形成再由服务端发起请求的一种安全漏洞。攻击者可能会导致服务器与组织基础设施内的仅限内部服务建立连接。从而可能泄露授权凭据等敏感数据。
一般情况下,外网无法进行访问的内部系统会作为SSRF的攻击目标,SSRF能够让服务器替攻击者去发送请求。
产生原因:
服务端会提供从远程服务器应用获取数据的功能,但在对远程服务器地址的传递过程中并没有对目标地址进行过滤和限制,这便是SSRF形成的原因。
1.2 SSRF 危害
- 敏感信息泄露
- 未经授权行为
- 执行任意命令
1.3 相关危险函数
主要是网络访问,支持伪协议的网络读取。以PHP为例,涉及到的函数有
-
file_get_contents()
-
fsockopen()
-
curl_exec()
等
2. SSRF 可能利用点
2.1 内网服务
- Apache Hadoop远程命令执行
- axis2-admin部署Server命令执行
- Confluence SSRF
- counchdb WEB API远程命令执行
- dict
- docker API远程命令执行
- Elasticsearch引擎Groovy脚本命令执行
- ftp / ftps(FTP爆破)
- glassfish任意文件读取和war文件部署间接命令执行
- gopher
- HFS远程命令执行
- http、https
- imap/imaps/pop3/pop3s/smtp/smtps(爆破邮件用户名密码)
- Java调试接口命令执行
- JBOSS远程Invoker war命令执行
- Jenkins Scripts接口命令执行
- ldap
- mongodb
- php_fpm/fastcgi 命令执行
- rtsp - smb/smbs(连接SMB)
- sftp
- ShellShock 命令执行
- Struts2 命令执行
- telnet
- tftp(UDP协议扩展)
- tomcat命令执行
- WebDav PUT上传任意文件
- WebSphere Admin可部署war间接命令执行
- zentoPMS远程命令执行
2.2 Redis服务
- 写ssh公钥
- 写crontab
- 写WebShell
- Windows写启动项
- 主从复制加载 .so 文件
- 主从复制写无损文件
2.3 云主机
在AWS、Google等云环境下,通过访问云环境的元数据API或管理API,在部分情况下可以实现敏感信息等效果。
3. SSRF 预防
- 禁止跳转
- 过滤返回信息
- 统一错误信息
- 设置URL白名单和内网IP
- 协议白名单(只允许http和https)
- 限制请求端口为常用端口(80 443 8080)
- 对DNS Rebinding,考虑使用DNS缓存或者Host白名单
4. SSRF 绕过
4.1 完全知情SSRF漏洞
1. 更改IP地址的写法
如将点分十进制转化为八进制、十进制整数类型、十六进制等格式。
当转化为其它格式时候,如果web容器使用Apache则会出现错误,使用Nginx等则无问题。
一些开发者会通过对传过来的URL参数进行正则匹配的方式来过滤掉内网IP,如采用如下正则表达式:
^10(\.([2][0-4]\d|[2][5][0-5]|[01]?\d?\d)){3}$
^172\.([1][6-9]|[2]\d|3[01])(\.([2][0-4]\d|[2][5][0-5]|[01]?\d?\d)){2}$
^192\.168(\.([2][0-4]\d|[2][5][0-5]|[01]?\d?\d)){2}$
对于这种过滤我们采用改编IP的写法的方式进行绕过,例如192.168.0.1这个IP地址可以被改写成:
- 8进制格式:0300.0250.0.1
- 16进制格式:0xC0.0xA8.0.1
- 10进制整数格式:3232235521
- 16进制整数格式:0xC0A80001
- 合并后两位:1.1.278 / 1.1.755
- 合并后三位:1.278 / 1.755 / 3.14159267
另外IP中的每一位,各个进制可以混用。
访问改写后的IP地址时,Apache会报400 Bad Request,但Nginx、MySQL等其他服务仍能正常工作。
另外,0.0.0.0这个IP可以直接访问到本地,也通常被正则过滤遗漏。
2. 使用解析到内网的域名
如果服务端没有先解析IP再过滤内网地址,我们就可以使用localhost等解析到内网的域名。
另外
xip.io
提供了一个方便的服务,这个网站的子域名会解析到对应的IP,例如192.168.0.1.xip.io,解析到192.168.0.1。3. 利用解析URL出现的问题
在某些情况下,后端程序可能会对访问的URL进行解析,对解析出来的host地址进行过滤。这时候可能会出现对URL参数解析不当,导致可以绕过过滤。
比如
http://www.baidu.com@192.168.0.1/
当后端程序通过不正确的正则表达式(比如将http之后到com为止的字符内容,也就是www.baidu.com,认为是访问请求的host地址时)对上述URL的内容进行解析的时候,很有可能会认为访问URL的host为www.baidu.com,而实际上这个URL所请求的内容都是192.168.0.1上的内容。4. 利用跳转(重定向)
如果后端服务器在接收到参数后,正确的解析了URL的host,并且进行了过滤,我们这个时候可以使用跳转的方式来进行绕过。
可以使用如 http://httpbin.org/redirect-to?url=http://192.168.0.1 等服务跳转,但是由于URL中包含了192.168.0.1这种内网IP地址,可能会被正则表达式过滤掉,可以通过短地址的方式来绕过。
常用的跳转有302跳转和307跳转,区别在于307跳转会转发POST请求中的数据等,但是302跳转不会。
5. 利用各种非HTTP协议
如果服务器端程序对访问URL所采用的协议进行验证的话,可以通过非HTTP协议来进行利用。
比如通过gopher,可以在一个url参数中构造POST或者GET请求,从而达到攻击内网应用的目的。例如可以使用gopher协议对与内网的Redis服务进行攻击,可以使用如下的URL:
除了gopher协议,File协议也是SSRF中常用的协议,该协议主要用于访问本地计算机中的文件,我们可以通过类似
file:///path/to/file
这种格式来访问计算机本地文件。使用file协议可以避免服务端程序对于所访问的IP进行的过滤。例如我们可以通过 file:///d:/1.txt
来访问D盘中1.txt的内容。6. DNS Rebinding
一个常用的防护思路是:对于用户请求的URL参数,首先服务器端会对其进行DNS解析,然后对于DNS服务器返回的IP地址进行判断,如果在黑名单中,就禁止该次请求。
但是在整个过程中,第一次去请求DNS服务进行域名解析到第二次服务端去请求URL之间存在一个时间差,利用这个时间差,可以进行DNS重绑定攻击。
要完成DNS重绑定攻击,我们需要一个域名,并且将这个域名的解析指定到我们自己的DNS Server,在我们的可控的DNS Server上编写解析服务,设置TTL时间为0。这样就可以进行攻击了,完整的攻击流程为:
- 服务器端获得URL参数,进行第一次DNS解析,获得了一个非内网的IP
- 对于获得的IP进行判断,发现为非黑名单IP,则通过验证
- 服务器端对于URL进行访问,由于DNS服务器设置的TTL为0,所以再次进行DNS解析,这一次DNS服务器返回的是内网地址。
- 由于已经绕过验证,所以服务器端返回访问内网资源的结果。
7. 利用IPv6协议
有些服务没有考虑IPv6的情况,但是内网又支持IPv6,则可以使用IPv6的本地IP如
[::]
0000::1
或IPv6的内网域名来绕过过滤。8. 利用IDN
一些网络访问工具如Curl等是支持国际化域名(Internationalized Domain Name,IDN)的,国际化域名又称特殊字符域名,是指部分或完全使用特殊的文字或字母组成的互联网域名。
在这些字符中,部分字符会在访问时做一个等价转换,例如
ⓔⓧⓐⓜⓟⓛⓔ.ⓒⓞⓜ
和 example.com
等同。利用这种方式,可以用 ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩
等字符绕过内网限制。9. 利用全角符号
5. 盲目的 SSRF 漏洞
5.1 什么是盲式 SSRF?
当可以诱使应用程序向提供的 URL 发出后端 HTTP 请求,但来自后端请求的响应不会在应用程序的前端响应中返回时,就会出现盲 SSRF 漏洞。
5.2 盲目 SSRF 漏洞危害
盲目的 SSRF 漏洞的影响通常低于完全知情的 SSRF 漏洞,因为它们具有单向性质。不能轻易地利用它们从后端系统检索敏感数据,尽管在某些情况下,可以利用它们来实现完全的远程代码执行。
5.3 如何查找和利用盲目的 SSRF 漏洞
检测盲 SSRF 漏洞的最可靠方法是使用带外 (OAST) 技术。这涉及尝试触发对您控制的外部系统的 HTTP 请求,并监视与该系统的网络交互。
使用带外技术的最简单,最有效的方法是使用Burp Collaborator。您可以使用 Burp Collaborator 客户端生成唯一的域名,以有效负载的形式将这些域名发送到应用程序,并监视与这些域的任何交互。如果观察到来自应用程序的传入 HTTP 请求,则它容易受到 SSRF 的攻击。
在测试 SSRF 漏洞时,可能会有DNS,但没有后续的 HTTP 请求。发生这种情况通常是因为应用程序尝试向域发出 HTTP 请求,这会导致初始 DNS 查找,但实际的 HTTP 请求被网络级筛选阻止。基础设施允许出站 DNS 流量是相对常见的,因为出于许多目的都需要这样做,但会阻止与意外目标的 HTTP 连接。
5.4 利用
- 可以利用它来探测服务器本身或其他后端系统上的其他漏洞。
- 可以盲目地扫描内部 IP 地址空间,发送旨在检测已知漏洞的有效负载。
- 如果这些有效负载还采用盲带外技术,则可能会在未修补的内部服务器上发现关键漏洞。
利用盲目SSRF漏洞的另一种途径是
诱使应用程序连接到攻击者控制下的系统,并向建立连接的HTTP客户端返回恶意响应。
如果可以利用服务器的 HTTP 实现中的严重客户端漏洞,则可以在应用程序基础结构中实现远程代码执行。
参考文章
本文章仅提供学习使用,有任何问题,欢迎您在底部评论区留言,一起交流~
- Author:KoGe
- URL:https://www.shipangshuo.xyz/article/ssrf
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts