自己最近原本是想深入的學習一下關於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等等