一、什么是SSRF
SSRF(server-side request forge,服务端请求伪造),是攻击者构造的攻击链接传给服务端执行造成的漏洞,一般用来再外网探测或攻击内网服务。
二、SSRF漏洞形成原因
大都是由于服务器端提供了从其他服务器应用获取数据的功能,但又没有做严格过滤与限制,导致攻击者可以传入任意的地址来让后端服务器对其发送的请求,并返回对该目标请求的数据。
最常见的例子:攻击者传入一个未经验证的URL,后端代码直接请求这个URL
,就会造成SSRF漏洞。
三、与CSRF的区别
CSRF(跨站请求伪造,Cross-site request forgery)发生条件,当用户在安全网站A登陆后保持登陆的状态,并同时浏览了保存恶意代码的另一个网站B,此时B网站劫持用户浏览器并以用户登陆的状态对A网站发送了用户本人操作的请求。
CSRF是服务器没有对用户提交的数据进行随机值的校验,且对http请求的referer字段校验不严,导致攻击者可以利用用户的Cookie信息伪造用户请求发送至服务器。
SSRF是服务器对用户提供的URL过于信任,没有对攻击者提供的URL进行地址限制和足够的检测,导致攻击者可以以此为跳板攻击内网或者其他服务器。
四、SSRF攻击的危害
1、获取web应用可达服务器的banner信息,以及收集内网服务的指纹信息,内部网络和端口信息。
2、攻击运行在内网的系统或者应用程序,对含有漏洞的内网服务实施攻击获取webshell。
3、通过URL Scheme读取内部资源或者让服务器执行相应的攻击动作。
-
-
-
获取webshell:Srtuts2命令执行,通过Redis未授权getshell等。
五、漏洞场景
1、从Web功能点寻找
通过URL地址分享网页的内容,通过目标地址获取了图片内容,如果此功能中没有对目标地址的范围做过过滤与限制,则可能存在SSRF漏洞。
这里有个问题,即使我们发现了有SSRF漏洞,但是有一种情况,我们是需要知道它的内网地址的。
-
第一种方法,就是前期的信息收集,发现了他内网的ip,直接利用。
-
第二种方法,就是通过FUZZ,对内网地址进行枚举。
2、在线翻译
这里我们可以在自己的服务器创建一个2.dtd文件,让它来请求,如果请求成功,就会在自己的服务器得到回显。
3、通过URL地址加载与下载图片
开发者为了更好的用户体验,通常对图片做一些调整,而没有直接使用img标签,就可能造成SSRF漏洞。
4、图片,文章收藏功能
类似于1中分享功能获取URL地址里的title及文本的内容作为显示。
5、社交分享功能
获取超链接的标题等内容进行显示,qq浏览器->qq->链接->服务端->数据。
6、转码服务
通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览,在线播放器->url地址。
7、云服务器厂商
它会远程执行一些命令来判断网站是否存活,所以如果可以捕获相应的信息,就可以进行ssrf测试。
8、网站采集,网站抓取的地方
9、邮件系统
10、编码处理,属性信息处理,文件处理
比如ffpmg,imageMagick,docx,pdf,xml处理器等。
11、未公开的api实现以及其他扩展调用URL的功能
可以利用google语法加上这些关键字去寻找SSRF漏洞。
12、从URL的关键字寻找
六、SSRF总结
-
-
七、漏洞利用
1、dict协议运用
dict协议是一个字典服务器协议,通常用于让客户端使用过程中能够访问更多的字典源。
在SSRF中如果可以使用此协议,就可以轻易获取目标服务器端口上运行的服务版本等信息。
Curl:一种命令行工具,作用是发出网络请求,获取数据。
Curl -v:显示HTTP通信的整个过程,包括端口连接和HTTP request头信息。
curl -v 'dict://127.0.0.1:22'
curl -v 'http://www.baidu.com:8080/vulnhub/ssrf.php?url=dict://139.9.198.30:22'
2、file协议运用
curl -v 'file:///etc/passwd'
curl -v 'http://www.baidu.com:8080/vulnhub/ssrf.php?url=file:///etc/passwd'
3、gopher协议运用
gopher://10.0.0.1:6789/Hi%0aEveryone%0athis%20is%20just%20a%20test
4、PHP中下面的函数使用不当会导致SSRF
5、curl_exec()
http://47.105.75.177:8080/vulnhub/ssrf/ssrf1/curl.php?url=dict://47.101.214.85:24680
http://47.105.75.177:8080/vulnhub/ssrf/ssrf1/curl.php?url=dict://127.0.0.1:22
3、然后再有SSRF漏洞的地方执行:http://47.105.75.177:8080/vulnhub/ssrf/ssrf1/curl.php?url=dict://47.101.214.85:3389
如果说端口开启的话,那它就会有相应的显示,如果端口未开启,则没有相应的显示,但是这也是依据情况而定的。
如果我们不知道目标开了那些端口,这里我们就可以使用Burp对端口进行爆破,我们可以使用全端口爆破,也可以使用普通端口爆破。
6、敏感文件的读取
Windows:file://c:windowswin.ini
file:///etc/httpd/conf/httpd.conf
7、file_get_contents()
php://filter/read=convert.base64-encode/resource=fgc.php
这里使用php的伪协议读取,我们再这里直接file://fgc.php的话,会直接解析出来,但是我们想要读取网页的源代码的话,还是要使用这个伪协议。
8、fsockopen()
fsockopen()-打开一个网络连接或unix套接字连接,这个函数可以指定的ip和端口里面的信息进行返回。
八、无回显的SSRF
Burpsuite Collaborator client
1、HTTP的带外通道
copy的内容:lvk4c5vtx5vukn8370bqdrpa61cr0g.burpcollaborator.net
SSRF的案例:https://blog.csdn.net/Fly_hps/article/details/84396690
2、DNSlog
九、SSRF漏洞利用限制绕过
1、利用解析URL
某些情况下,后端程序可能会对访问的URL进行解析,对解析出来的host地址进行过滤,这时可能会出现对URL参数解析不当,导致可以绕过过滤。
2、IP地址转换成进制
3、添加端口可能绕过匹配正则
4、利用xip.io,xip.name
当我们访问这个网站的子域名时,如192.168.0.1.xip.io
,会自动重定向到192.168.0.1
。
因此可以利用302跳转进行绕过,即IP地址设为ip.xip.io或www.ip.xip.io。
5、短网址绕过
内网IP地址有时会被正则表达式过滤掉,可以通过短网址的方式是来进行绕过;
生成短网址地址链接:https://www.ft12.com/
6、利用句号
7、探测内网域名
8、[::]绕过localhost
9、封闭式字母数字(Enclosed Alphanumerics):
10、@符
十、SSRF漏洞防御
5、禁用不需要的协议,仅允许http和https请求。
文章来源:https:
文章作者:小王的黑色短裤
如有侵权,联系删除
声明:⽂中所涉及的技术、思路和⼯具仅供以安全为⽬的的学习交流使⽤,任何⼈不得将其⽤于⾮法⽤途以及盈利等⽬的,否则后果⾃⾏承担。所有渗透都需获取授权!
原文始发于微信公众号(白帽子左一):Web安全-SSRF服务端请求伪造 - 7
评论