ssrf

Dec 31, 2018 00:00 · 2362 words · 5 minute read ssrf

0x00 SSRF是什么

SSRF,Server-Side Request Forgery,服务端请求伪造,是一种由攻击者构造形成由服务器端发起请求的一个漏洞。一般情况下,SSRF 攻击的目标是从外网无法访问的内部系统。

攻击者可以利用 SSRF 实现的攻击主要有 5 种:

  • 可以对外网、服务器所在内网、本地进行端口扫描,获取一些服务的 banner 信息
  • 攻击运行在内网或本地的应用程序(比如溢出)
  • 对内网 WEB 应用进行指纹识别,通过访问默认文件实现
  • 攻击内外网的 web 应用,主要是使用 GET 参数就可以实现的攻击(比如 Struts2,sqli 等)
  • 利用 file 协议读取本地文件等

0x01 SSRF 漏洞出现的场景

能够对外发起网络请求的地方,就可能存在 SSRF 漏洞

  • 社交分享功能:获取超链接的标题等内容进行显示

  • 转码服务:通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览

  • 在线翻译:给网址翻译对应网页的内容

  • 图片加载/下载:例如富文本编辑器中的点击下载图片到本地;通过URL地址加载或下载图片

  • 图片/文章收藏功能:主要其会取URL地址中title以及文本的内容作为显示以求一个好的用具体验

  • 云服务厂商:它会远程执行一些命令来判断网站是否存活等,所以如果可以捕获相应的信息,就可以进行ssrf测试

  • 网站采集,网站抓取的地方:一些网站会针对你输入的url进行一些信息采集工作

  • 数据库内置功能:数据库的比如mongodb的copyDatabase函数

  • 邮件系统:比如接收邮件服务器地址

  • 编码处理, 属性信息处理,文件处理:比如ffpmg,ImageMagick,docx,pdf,xml处理器等

  • 未公开的api实现以及其他扩展调用URL的功能:可以利用google 语法加上这些关键字去寻找SSRF漏洞

一些的url中的关键字:share、wap、url、link、src、source、target、u、3g、display、sourceURl、imageURL、domain……

  • 从远程服务器请求资源(upload from url 如discuz!;import & expost rss feed 如web blog;使用了xml引擎对象的地方 如wordpress xmlrpc.php)

    0x02 漏洞产生

  • file_get_content

    <?php
    if(isset($_GET['url'])){
    $con=file_get_contents($_GET['url']);
    $filen='./img/'.rand().'img.jpg';
    file_put_contents($filen,$con);
    $img="<img src=\"".$filen."\"/>";
    }
    echo $img;
    ?>
    读取外部图片,可用file读/etc/passwd
    
  • fsockopen

    <?php
    $url="www.baidu.com";
    $fp = fsockopen($url, 80, $errno, $errstr, 30);
    if (!$fp) {
    echo "$errstr ($errno)<br />\n";
    } else {
    $out = "GET / HTTP/1.1\r\n";
    $out .= "Host: ".$url."\r\n";
    $out .= "Connection: Close\r\n\r\n";
    fwrite($fp, $out);
    while (!feof($fp)) {
        echo fgets($fp, 128);
    }
    fclose($fp);
    }
    ?>
    
  • curl_exec

    <?php
    //初始化
    $curl = curl_init();
    //设置抓取的url
    curl_setopt($curl, CURLOPT_URL, 'http://www.baidu.com');
    //设置头文件的信息作为数据流输出
    curl_setopt($curl, CURLOPT_HEADER, 1);
    //设置获取的信息以文件流的形式返回,而不是直接输出。
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    //执行命令
    $data = curl_exec($curl);
    //关闭URL请求
    curl_close($curl);
    //显示获得的数据
    print_r($data);
    ?>
    无回显,nc监听,有302跳转,curl可利用协议多
    

    0x03 漏洞验证

  • 排除法:浏览器f12查看源代码看是否是在本地进行了请求

比如:该资源地址类型为 http://www.xxx.com/a.php?image=(地址)的就可能存在SSRF漏洞

  • dnslog等工具进行测试,看是否被访问

可以在盲打后台用例中将当前准备请求的uri 和参数编码成base64,这样盲打后台解码后就知道是哪台机器哪个cgi触发的请求。

  • 抓包分析发送的请求是不是由服务器的发送的,如果不是客户端发出的请求,则有可能是,接着找存在HTTP服务的内网地址

从漏洞平台中的历史漏洞寻找泄漏的存在web应用内网地址

通过二级域名暴力猜解工具模糊猜测内网地址

  • 直接返回的Banner、title、content等信息

  • 留意bool型SSRF

    0x04 利用思路

  • 获取web应用可达服务器服务的banner信息以及收集内网web应用的指纹识别,如开放的端口,中间件版本信息等。

  • 攻击运行在内网的系统或应用程序,获取内网各系统弱口令进行内网漫游、对有漏洞的内网web应用实施攻击获取webshell,如st2命令执行、discuz ssrf通过redis实施getshell等。

  • 利用有脆弱性的组件结合ftp://,file:///,gopher://,dict://等协议实施攻击。如FFmpeg任意文件读取,xxe攻击等。

0x05 绕过技巧

1.http://baidu.com@www.baidu.com/与http://www.baidu.com/请求时是相同的

2.各种IP地址的进制转换

3.URL跳转绕过:http://www.hackersb.cn/redirect.php?url=http://192.168.0.1/

4.短网址绕过 http://t.cn/RwbLKDx

5.xip.io来绕过:http://xxx.192.168.0.1.xip.io/ == 192.168.0.1 (xxx 任意)

指向任意ip的域名:xip.io(37signals开发实现的定制DNS服务)

6.限制了子网段,可以加 :80 端口绕过。http://tieba.baidu.com/f/commit/share/openShareApi?url=http://10.42.7.78:80

7.探测内网域名,或者将自己的域名解析到内网ip

8.例如 http://10.153.138.81/ts.php , 修复时容易出现的获取host时以/分割来确定host,

但这样可以用 http://abc@10.153.138.81/ 绕过

0x06 漏洞防御

1.禁止跳转

2.过滤返回信息,验证远程服务器对请求的响应是比较容易的方法。如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。

3.禁用不需要的协议,仅仅允许http和https请求。可以防止类似于file://, gopher://, ftp:// 等引起的问题

4.设置URL白名单或者限制内网IP(使用gethostbyname()判断是否为内网IP)

5.限制请求的端口为http常用的端口,比如 80、443、8080、8090

6.统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。

0x07 案例

  1. 内网探测的话用burpsuite就可以,设置变量跑,也有猪猪侠内网探测的脚本
  2. 302脚本 <?php $ip = $_GET['ip']; $port = $_GET['port']; $scheme = $_GET['s']; $data = $_GET['data']; header("Location: $scheme://$ip:$port/$data"); ?> 具体案例看猪猪侠

0x08 参考资料

https://www.anquanke.com/post/id/145519?from=timeline#h2-5 https://xz.aliyun.com/t/2115#toc-8 https://www.cnblogs.com/zhaijiahui/p/7828585.html#autoid-7-1-4 https://ctf-wiki.github.io/ctf-wiki/web/ssrf/#ssrf_2 http://www.91ri.org/17111.html