SSRF漏洞挖掘利用技巧
参考文章
- SSRF漏洞(原理&绕过姿势)
- SSRF绕过方法总结
- SSRF绕过IP限制方法总结
- Tag: #SSRF
- Ref:
概述
总结
利用一个可以发起网络请求的服务当作跳板来攻击内部其他服务。
一、漏洞介绍
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常用的端口