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上看到的图

 

 

 

 

 

posted @ 2018-04-07 22:22  slpawn  阅读(253)  评论(0编辑  收藏  举报