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组合能达成很多功能具体用法还要深入研究。