这篇文章写地很好。
SSRF(Sever-Side-Request-Forgery,服务端请求伪造)是一种由攻击者构造请求,由服务端发起请求的安全漏洞。SSRF的形成大多是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。【摘自《web安全攻防》】
正常情况下的请求应该是这样的。
但是如果服务器存在SSRF漏洞,则会出现下图的情况。
页面ssrf/index.php
实现的功能是获取GET参数url,然后将url的内容返回网页上。先尝试获取外网 URL 试试看,测试一下经典的百度:
那么接下来尝试获取内网 URL 看看,测试请求 127.0.0.1 看看会有什么反应:
测试依然成功,我们看到了 “套娃” 现象。 通过以上两次请求,已经基本上可以确定这个输入框就是传说中的 SSRF 的漏洞点了,即没有对用户的输入进行过滤,导致可以用来发起任意的内网或者外网的请求。
既然当前站点存在 SSRF 的话,我们可以尝试配合 file 协议来读取本地的文件信息,首先尝试使用 file 协议来读取 /etc/passwd 文件试试看:
http://8.134.148.36:8001/ssrf/index.php?url=file:///etc/passwd
成功读取到了本地的文件信息,现在尝试来获取存在 SSRF 漏洞的本机内网 IP 地址信息,确认当前资产的网段信息:
http://8.134.148.36:8001/ssrf/index.php?url=file:///etc/hosts
可以判断当前机器的内网地址为 172.17.0.2,那么接下来就可以对这个内网资产段进行信息收集了。
BP 下使用迭代器模式爆破,设置好要爆破的 IP 和 端口即可批量探测出端口开放的信息:
可以根据上面的端口开放情况,猜测内网开放什么服务,比如6379
是Redis的服务,3306
是MySQL的服务等等。
这是以前的写的一篇文章, 中间件漏洞 | weblogic-ssrf 。中间件 weblogic 存在 ssrf 漏洞,通过该漏洞探测到内网存在主机并开放了Redis服务,因此可以通过 ssrf 漏洞攻击内网应用。
//GET获取参数url$link = $_GET['url']; $filename = './curled/'.rand().'txt'; //初始化curl组件$curlobj = curl_init($link); $fp = fopen($filename,"w"); curl_setopt($curlobj, CURLOPT_FILE, $fp); curl_setopt($curlobj, CURLOPT_HEADER, 0); //请求urlcurl_exec($curlobj); curl_close($curlobj); fclose($fp); $fp = fopen($filename,"r"); $result = fread($fp, filesize($filename)); fclose($fp); echo $result; }
?>