刚刚理清楚这个漏洞,容我去跑个步,再回来修改这篇文章,等我啊,现在是晚上22.27,刚刚问了朋友一个有关xxe的问题,耗费了点时间。那现在就开始。
漏洞原理
XXE漏洞全称XML External Entity Injection,即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,就可能导致任意文件读取、系统命令执行、内网端口探测、攻击内网网站等危害。
讲到这里如果有了解的应该是懂了,但是我猜有些人肯定很晕,接下来我解决你的困惑。(以下但是个人的理解,如果不严谨,轻喷,好哥哥们)
什么是XML
说白了,就是一种数据格式,或者储存数据的格式。类似的有json等等,但是跟这些常见的数据格式又是有区别的,它能定义元素,实体。
什么是元素
有了解过html,应该知道啥是元素,比如
等等,在html都是定义好的,但是在xml中是有用户自定义的
什么是实体
这里就是产生漏洞的关键,首先你要知道DTD是啥,网上有这么一句话:拥有正确语法的 XML 被称为“形式良好”的 XML,通过 DTD 验证的 XML 是“合法”的 XML。
图看不懂没事,你只要知道DTD是文档类型定义,就是一种规矩吧。对于xml可有可无,但是要触发xxe漏洞,就必须要这个部分。因为这个部分可以定义实体。
内部实体可以理解为定义一个变量,给一个变量值,然后通过&变量名;的方法就可以打印出变量值。但是当变量值为URL时,此时定义的实体就是外部实体(这是xml决定的,它会去执行这个URL,而且有很多的伪协议),当这里写成恶意代码呢,不就叫做xml外部实体注入。
伪协议
这是你利用验证漏洞,必须知道的知识。
用的最多的就是file协议,功能读取文件
漏洞利用
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<root>
<name>&xxe;</name>
</root>
这是常见读取/etc/passwd的攻击代码。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "http://127.0.0.1/1.dtd" >]>
<root>
<name>&xxe;</name>
</root>
1.dtd
<!ENTITY send SYSTEM "file:///etc/passwd">
这种也是一种常见写法。
漏洞危害
- 文件读取
- RCE
- 内网探测
- 攻击内网主机
漏洞防御
xxe漏洞跟所处的语言环境没有直接关系,跟libxml有直接关系。libxml2.9.0以后,默认不解析外部实体,导致XXE漏洞逐渐消亡。
-
禁用外部实体
PHP:
libxml_disable_entity_loader(true);JAVA:
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();dbf.setExpandEntityReferences(false);Python:
from lxml import etreexmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False)) -
过滤
过滤用户提交的XML数据
过滤关键词:<!DOCTYPE和<!ENTITY,或者SYSTEM和PUBLIC
总结
现实吃瓜中,XXE漏洞我是没碰见。所以也忽视这个漏洞原理啥的,作为网络安全人员,说句实话基础的东西还是要懂的,不然被别人问道,答不上来,说不上话,就很尴尬。或许根本用不到,但你得知道(其实xxe还有很多细节,但也没必要太深入)。切勿浮躁!!!
如果有什么问题,什么方面都可以,欢迎评论或者私信