自己最近原本是想深入的学习一下关于xss、csrf的东西的,可是感觉这些东西需要有很好的js的基础来进行学习。。还有感觉自己感觉也差不多该要学习内网渗透了。。正好ssrf在内网这一块也是比较有用的。于是现在学习一下。
我这里面是以php里面的curl为例子来学习的。
漏洞代码如下
<?php $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $_GET['url']); #curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_HEADER, 0); #curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS); curl_exec($ch); curl_close($ch); ?>//这段代码直接将get请求中的url直接放在里面,并且没有屏蔽回显。
一般这种请求都需要使用libcurl库。
我们看一下curl支持地协议(curl -V).
我们看到确实支持很多的协议,首先我们看一下file协议,他是一个读取任意文件的协议,又因为这里面没有关闭回显,所以我们直接在浏览器中访问 http://xxxx/ssrf.php?url=file:///etc/passwd
我这边已经成功地读取到了,相应的只要你有其他的文件的路径,当然也可以读取(当然如何屏蔽了回显,就没多大的用处了)。
接下来就是很多前辈一直说的gopher协议了,因为这个协议可以伪造各种http请求,所以经常被用于ssrf中(访问一些内网中脆弱的web应用等等)。
这个协议利用起来也是比较麻烦的QAQ。。一般是需要抓取流量包,然后再根据流量包来进行exp的构造。
这个的话我推荐二篇博客吧:https://joychou.org/web/phpssrf.html https://www.cnblogs.com/p0pl4r/p/10336501.html
大佬们都已经讲的很好了,我就不瞎掺和了2333
dict协议,这个协议是一个字典服务器协议,通常用于让客户端使用过程中能够访问更多的字典源,但是在SSRF中如果可以使用dict协议那么就可以轻易的获取目标服务器端口上运行的服务版本等信息。
例如访问:http://xxxx/ssrf.php?url=dict://10.0.0.9:22(ssh端口)/info 就可以获取到ssh相关的信息
同理的,关于其他的端口信息,我们都可以通过这种方式来进行收集。
当然对于ssrf in PHP来说还是不只curl这一个能引起漏洞,其他的例如 file_get_contents和fsockopen等等