SSRF(Server-Side Request Forgery, 服务端请求伪造),攻击者伪造服务端发起的请求并执行,从而获得一些数据或进行攻击

444.png

危害

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;
?>

1148276-20180407162832184-1820362038.png

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);
}
?>

123.png

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协议读取本机文件

1234.png

利用dict协议探测端口服务

321.png

然后就是gopher协议

Gopher 协议可以发get,post请求,还利用此协议可以攻击内网的一些应用

基本格式 URL:gopher://<host>:<port>/<gopher-path>

简单验证下发送数据包
下载.jpg

防护

对允许的协议进行限制 只能是HTTP、HTTPS这样

设置URL白名单或者限制内网IP

禁止30x跳转

过滤返回信息、返回结果展示给用户之前先验证返回的信息是否符合标准

标签: ssrf

添加新评论