ssrf小记
SSRF(Server-Side Request Forgery, 服务端请求伪造),攻击者伪造服务端发起的请求并执行,从而获得一些数据或进行攻击
一、危害
1.对内网的端口和服务进行扫描,对主机本地的一些敏感信息获取
2.利用一些应用漏洞和一些协议进行攻击
二、常见容易造成漏洞的php函数以及利用
1.file_get_contents()
2.fsockopen()
3.curl_exec()
逐一简单的测试一下
1.file_get_content() 函数把整个文件读入一个字符串中。
测试代码
<?php
if(isset($_POST['url']))
{
$content=file_get_contents($_POST['url']);
$filename='./images/test.img';\
file_put_contents($filename,$content);
echo $_POST['url'];
$img="<img src=\"".$filename."\"/>";
}
echo $img;
?>
2.fsockopen() 打开一个网络连接或者一个Unix套接字连接
测试代码
<?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);
}
?>
3.curl_exec() 对于这个函数的利用就比较多了,主要是配合其他协议一起使用
curl支持file、dict、gopher、ftp、telnet、http等协议
通常攻击中用到的是file,dict,gopher这几个协议
测试代码
<?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协议
Gopher 协议可以发get,post请求,还利用此协议可以攻击内网的一些应用
基本格式 URL:gopher://<host>:<port>/<gopher-path>
简单验证下发送数据包
ps : 对于一些更深层次的利用 对redis等的攻击还没有进行复现 五月底考完试了再研究研究
三、防护
对允许的协议进行限制 只能是HTTP、HTTPS这样
设置URL白名单或者限制内网IP
禁止30x跳转
过滤返回信息、返回结果展示给用户之前先验证返回的信息是否符合标准
最后上一张91ri上看到的图