首页 > 编程知识 正文

php xxe注入,PHP XXE漏洞

时间:2023-05-06 02:42:33 阅读:230403 作者:2

PHP xml 外部实体注入漏洞(XXE)

1.环境

PHP 7.0.30

Libxml 2.8.0

Libxml2.9.0 以后 ,默认不解析外部实体,对于PHP版本不影响XXE的利用

2.原理介绍

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

3.漏洞危害

读取任意文件

执行系统命令

探测内网端口

攻击内网网站

4.测试

启动并且编译环境

docker-compose up -d

看见done后,访问http://192.168.5.136: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漏洞,具体输出点请阅读这三个文件的代码。

源码如下:

XXE示例 payload

]>

&xxe;

可以看到读取到了,root下的信息

5.解决方案和建议

5.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))

5.2 过滤用户提交的XML数据

如:!ENTITY,SYSTEM和PUBLIC

参考

https://www.owasp.org/index.php/Testing_for_XML_Injection_(OTG-INPVAL-008)

未来工作

实战配图加上

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。