ssrf漏洞分析
關於ssrf
- 首先簡單的說一下我理解的ssrf,大概就是服務器會響應用戶的url請求,但是沒有做好過濾和限制,導致可以攻擊內網。
ssrf常見漏洞代碼
- 首先有三個常見的容易造成ssrf漏洞的函數需要注意
fsockopen()
file_get_contents()
curl_exec()
- 下面是本地搭建環境測試
- fsockopen()
<?php
$host=$_GET['url'];
$fp = fsockopen("$host", 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
$out = "GET / HTTP/1.1\r\n";
$out .= "Host: $host\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
while (!feof($fp)) {
echo fgets($fp, 128);
}
fclose($fp);
}
?>
-
-
fsockopen本身就是打開一個網絡連接或者Unix套接字連接。
- file_get_contents()
<?php
if(isset($_POST['url']))
{
$content=file_get_contents($_POST['url']);
$filename='./images/'.rand().'.img';\
file_put_contents($filename,$content);
echo $_POST['url'];
$img="<img src=\"".$filename."\"/>";
}
echo $img;
?>
-
-
file_get_contents是把文件寫入字符串,當把url是內網文件的時候,他會先去把這個文件的內容讀出來再寫入,導致了文件讀取。
- curl_exec()
<?php
if(isset($_GET['url']))
{
$link=$_GET['url'];
//$filename='./'.rand().'.txt';
$curlobj=curl_init($link);
curl_setopt($curlobj,CURLOPT_FILE,$link);
curl_setopt($curlobj,CURLOPT_HEADER,0);
$result=curl_exec($curlobj);
curl_exec($curlobj);
curl_close($curlobj);
//fclose($link);
//file_put_contents($filename, $result);
echo $result;
}
?>
-
這應該是大家最熟悉的一個函數了,因為利用方式很多最常見的是通過file dict gopher這三個協議來進行滲透。
-
上面是通過file協議讀取文件,下面這張圖是通過dict協議探測端口
-
然后是gopher協議
-
gopher協議和ssrf組合能達成很多功能具體用法還要深入研究。