SSRF
定义与成因
SSRF(Server-Side Request Forgery:服务器请求伪造)是一种由攻击者构造形成,由服务器段发起请求的一个安全漏洞。
一般情况下,SSRF攻击目标是从外网无法访问的内部系统。(正是因为它是由服务器端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)
SSRF漏洞形成的原因大都是由于服务器端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。比如从指定URL地址获取网页文本内容,加载指定地址的图片,下载等
具体代码
<?php
if(isset($_POST['url']))
{
$content = file_get_contents($_POST['url']);
$filename='./images/'.read().'.jpg';
$file_put_contents($filename,$contents);
echo $_POST['url'];
$img = "<img src=\"".$filename."\"/>";
echo $img;
}
else
{
echo "no url";
}
?>
**isset()**检查变量是否非空
危害
内网探测
利用file协议读取本地文件等
向内部任意主机的任意 端口发送精心构造的payload,从而攻击内网的应用(web应用等),主要是使用GET参数就可以实现的攻击(比如struts2,sqli等)
DOS攻击(请求大量文件,适中保持连接Keep-Alive Always)
验证
排除法:F12查看源代码是否在本地进行了请求
使用dnslog等工具进行测试,看是否被访问
其他代码
<?php
function GetFile($host,$post,$link){
$fp=fsockopen($host,intval($post),$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='';
wile(!feof($fp)){
$contents.=fgets($fp,1024);
}
fclose($fp);
return $contents;
}
}
<?php
if(isset($_POST['url'])){
$link = $_POST['url'];
$curlobj = curl_init();
curl_setopt($curlobj,CURLOPT_POST,0);
curl_setopt($curlobj,CURLOPT_URL,$link);
curl_setopt($curlobj,CURLOPT_RETURNTRANSFER,1);
$result=curl_exec($curlobj);
curl_close($curlobj);
$filename = './curled/'.read().'.txt';
file_put_contents($filename,$result);
echo $result;
}
?>
fsockopen可以用来模拟HTTP连接
**curl_init()**初始化一个cURL 会话
一些绕过
加端口
例如:127.0.0.1:80
短网址
指向任意IP的域名xip.io
127.0.0.1.xip.io依然指向这个Ip
IP限制绕过(进制转换)
@绕过(http://www.beidu.com@127.0.0.1)
(因为url网址是协议://用户名:密码@网址/网址文件?参数名=参数值#锚点
)
后面加参数(http://127.0.0.1?a=sdafwasdwfa)