SSRF(Server-Side Request Forgery)服务端请求为伪造
一、容易产生SSRF漏洞的函数
file_get_contents()、fsockopen()、curl_exec()
1、file_get_contents()
该函数的作用是将整个文件读入一个字符串中
<?php
if(isset($_POST['url']))
{
$content=file_get_contents($_POST['url']);
$filename='images/'.rand().'img1.jpg';
file_put_contents($filename,$content);
echo $_POST['url'];
$img="<img src=\"".$filename."\"/>";
}
echo $img;
?>
2、fsockopen()
该函数用于打开一个网络连接或者一个Unix套接字连接
<?php
function GetFile($host,$port,$link)
{
$fp=fsockopen($host,int($port),$errno,$errstr,30);
if(!fp)
{
echo "$errstr(error number $errno)\n";
}
else
{
$out="GET $link HTTP/1.1\r\n";
$out.="Host:$host\r\n";
$out.="Connection:Close\r\n\r\n";
$out.="\r\n";
fwrite($fp,$out);
$contents="";
while(!feof($fp))
{
$contents.=fgets($fp,1024);
}
fclose($fp);
return $contents;
}
}
?>
3、curl_exec()
该函数可以执行给定的 cURL 会话。
<?php
if(isset($_POST['url']))
{
$link = $_POST['url'];
$curlobj=curl_init();
curl_setopt($curlobj,CURLOPT_POST,0);
curl_setopt($curlobj,CURLOPT_RETURNTRANSFER,TRUE);
curl_setopt($curlobj,CURLOPT_URL,$link);
$result=curl_exec($curlobj);
curl_close($curlobj);
$filename='../images/'.rand().'.jpg';
file_put_contents($filename,$result);
$img="<img src=\"".$filename."\"/>";
echo $img;
}
?>
二、过滤绕过技巧
1、用@绕过
http://www.baidu.com@127.0.0.1
与http://127.0.0.1
请求是相同的
该请求得到的内容都是127.0.0.1的内容,此绕过同样在URL跳转绕过中适用
2、利用函数的解析不同进行绕过
此处图片和解析来自:
https://www.cnblogs.com/hetianlab/p/14012135.html
(1)readfile和parse_url解析差异,可用于绕过端口限制
readfile函数获取的端口是前面一部分的,而parse_url则是最后冒号的端口
(2)readfile和parse_url解析host的时候也有差异
parse_url函数解析的是前面的网址,readfile则是后面的
(3)curl和parse_url解析差异
curl解析的是第一个@后面的网址,而parse_url解析的是第二个@的网址
参考来自:
https://blog.csdn.net/weixin_44300286/article/details/108061457
https://www.cnblogs.com/hetianlab/p/14012135.html