SSRF漏洞挖掘利用技巧

参考文章


概述


总结
利用一个可以发起网络请求的服务当作跳板来攻击内部其他服务。


一、漏洞介绍

SSRF(Server-Side Request Forgery:服务器端请求伪造)


二、漏洞原理

由于服务端提供了从其他服务器应用获取资源的功能,但又没有对目标地址做严格过滤与限制,导致攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据。

数据流:攻击者--->服务器--->目标地址


三、漏洞危害

  • 内网信息泄露(端口、物理路径、配置信息、本地文件泄露等)
  • 内网或本地其他服务收到攻击,(DDos)
  • 穿透防火墙
  • 对内网web应用进行指纹识别,通过访问默认文件实现;

四、利用前提

  • 目标网站获取资源的方式
  • 可以控制目标网站获取指定资源,或向指定站点获取资源
  • 获取指定资源后,顺利通过过滤,成功执行
  • 可以获取过滤后或执行后的内容

五、挖掘利用

1、使用curl会话请求

描述
利用curl会话请求,获取相关地址的资源。

挖掘
因为可以通过GET请求、POST请求等方式,获取用户想要的目标资源,所以该漏洞的挖掘思路只能是判断观察服务器用户什么数据并执行(如给定数据https://www.baidu.com,观察是否访问了百度)
支持的协议dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtmp rtsp scp sftp smb smbs smtp smtps telnet tftp

利用
使用http、https等协议,搜寻我们想要的信息。下面以GET型举例

//探测端口、内网IP、等
?curl=http://127.0.0.1:80

//探测服务器物理目录、文件等
?curl=file:///C:/Windows/System32/drivers/etc/hosts

2、file_get_contents()

描述
该函数是用于把文件的内容读入到一个字符串中的首选方法。但是实际情况下,常常会输出它。且该函数时二进制安全的。可以用它获取相关地址的资源。

挖掘
同上。

利用
不明,可以使用file、http、https。

3、fsockopen()

4、SSRF in java

网络请求支持的协议如下:http,https,file,ftp,mailto,jar,netdoc
以下几种类引用不当会造成SSRF :Request类,URL类的openStream,HttpClient类,URLConnection和HttpURLConnection类,

5、SSRF in python

当使用了Python 的urllib库,请求url为用户可控时,就可能存在ssrf漏洞,且可以通过漏洞python urllib http头注入实现对内网未授权仿问的redis 服务器getshell

6、挖掘方向

  • 分享:通过url地址分享网页内容
  • 转码服务:通过url地址把源地址的网页内容调优使其适合手机屏幕浏览
  • 在线翻译:通过url地址翻译对应文本的内容
  • 能够对外发起网络请求的地方
  • 请求远程服务器资源的地方
  • 图片、文章、文件收藏功能
  • 未公开的api实现以及其他调用url的功能
  • 寻找关键字:share wap url link src source target u 3g display sourceURl imageURL domain(配合谷歌语法寻找)

7、绕过技巧

1.IP限制绕过

locahost绕过
攻击本地地址,过滤掉127.0.0.1的情况下,用locahost替代
[::]绕过
过滤掉locahost,可使用[::]替代
利用@
http://example.com@127.0.0.1
利用短地址
http://dwz.cn/11SMa (这个不太清楚)
进制转换绕过
十进制转换 八进制转换 十六进制转换  不同进制组合转换
例如将192.168.0.1改写成:

8进制格式:0300.0250.0.1
10进制整数格式:3232235521
16进制格式:0xC0.0xA8.0.1
16进制整数格式:0xC0A80001

利用Enclosed alphanumerics

利用Enclosed alphanumerics
ⓔⓧⓐⓜⓟⓛⓔ.ⓒⓞⓜ  >>>  example.com
List:
① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭ ⑮ ⑯ ⑰ ⑱ ⑲ ⑳ 
⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾ ⑿ ⒀ ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇ 
⒈ ⒉ ⒊ ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ ⒒ ⒓ ⒔ ⒕ ⒖ ⒗ ⒘ ⒙ ⒚ ⒛ 
⒜ ⒝ ⒞ ⒟ ⒠ ⒡ ⒢ ⒣ ⒤ ⒥ ⒦ ⒧ ⒨ ⒩ ⒪ ⒫ ⒬ ⒭ ⒮ ⒯ ⒰ ⒱ ⒲ ⒳ ⒴ ⒵ 
Ⓐ Ⓑ Ⓒ Ⓓ Ⓔ Ⓕ Ⓖ Ⓗ Ⓘ Ⓙ Ⓚ Ⓛ Ⓜ Ⓝ Ⓞ Ⓟ Ⓠ Ⓡ Ⓢ Ⓣ Ⓤ Ⓥ Ⓦ Ⓧ Ⓨ Ⓩ 
ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ ⓛ ⓜ ⓝ ⓞ ⓟ ⓠ ⓡ ⓢ ⓣ ⓤ ⓥ ⓦ ⓧ ⓨ ⓩ 
⓪ ⓫ ⓬ ⓭ ⓮ ⓯ ⓰ ⓱ ⓲ ⓳ ⓴ 
⓵ ⓶ ⓷ ⓸ ⓹ ⓺ ⓻ ⓼ ⓽ ⓾ ⓿

利用句号
127。0。0。1  >>>  127.0.0.1
利用302跳转
如果后端服务器在接收到参数后,正确的解析了URL的host,并且进行了过滤,我们这个时候可以使用302跳转的方式来进行绕过。
http://xip.io 当我们访问这个网站的子域名的时候,例如192.168.0.1.xip.io,就会自动重定向到192.168.0.1。
DNS Rebinding
对于常见的IP限制,后端服务器可能通过下图的流程进行IP过滤

对于用户请求的URL参数,首先服务器端会对其进行DNS解析,然后对于DNS服务器返回的IP地址进行判断,如果在黑名单中,就pass掉。
但是在整个过程中,第一次去请求DNS服务进行域名解析到第二次服务端去请求URL之间存在一个时间查,利用这个时间差,我们可以进行DNS 重绑定攻击。
要完成DNS重绑定攻击,我们需要一个域名,并且将这个域名的解析指定到我们自己的DNS Server,在我们的可控的DNS Server上编写解析服务,设置TTL时间为0。这样就可以进行攻击了,完整的攻击流程为:

(1)、服务器端获得URL参数,进行第一次DNS解析,获得了一个非内网的IP

(2)、对于获得的IP进行判断,发现为非黑名单IP,则通过验证

(3)、服务器端对于URL进行访问,由于DNS服务器设置的TTL为0,所以再次进行DNS解析,这一次DNS服务器返回的是内网地址。

(4)、由于已经绕过验证,所以服务器端返回访问内网资源的结果。

2.协议限制绕过

当url协议限定只为http(s)时,可以利用follow redirect 特性
构造302跳转服务,
结合dict:// file:// gopher://


六、修复防范

如果一定要通过后台服务器远程去对用户指定("或者预埋在前端的请求")的地址进行资源请求,则请做好目标地址的过滤(黑白名单)。

  • 限制协议为HTTP,HTTPS ,或禁止使用不需要的协议
  • 设置URL白列表或限制内网IP
  • 过滤返回信息
  • 统一错误信息
  • 限制请求的端口为http常用的端口

七、提出问题

posted @ 2021-01-28 23:48  GorillaLee  阅读(790)  评论(0编辑  收藏  举报