简介
1. XXE Injection(XML External Entity Injection)XML外部实体注入
服务端接收和解析了来自用户端的XML数据,而又没有做严格的安全控制,从而导致XML外部实体注入。
2. XML(Extensible Markup Language)可扩展标记语言
XML用来传输和存储数据;
XML的标签没有预定义,需要自行定义标签;
XML文档结构包括:XML声明、DTD文档、文档元素。
3. XML声明
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
version=“1.0”:此XML文档按照1.0版本的XML规则进行解析;
encoding=“utf-8”:此XML文档采用utf-8的编码格式;
standalone=“yes”:此XML文档是独立的,不能引用外部的DTD文档,若此属性为no,表示此XML不是独立的,能够引用外部的DTD文档,此属性默认值为yes。
4. DTD(Document Type Definition) 文档类型定义
定义XML文档的合法构建模块;
- DTD声明
内部声明DTD:<!DOCTYPE 根元素 [元素声明]>
引用外部DTD:<!DOCTYPE 根元素 SYSTEM "文件名">
或<!DOCTYPE 根元素 PUBLIC "public_ID" "文件名">
- DTD实体
定义引用普通文本或特殊字符的快捷方式的变量;
通用实体:<!ENTITY 实体名 "实体内容">
外部通用实体:<!ENTITY 实体名 SYSTEM "URI/URL">
或<!ENTITY 实体名 PUBLIC "public_ID" "URI/URL">
通用实体引用:&实体名;
参数实体:<!ENTITY % 实体名 "实体内容">
(%
后有个空格)
外部参数实体:<!ENTITY % 实体名 SYSTEM "URI/URL">
参数实体引用:%实体名;
参数实体只能在DTD中被引用
5. 文档元素(XML元素)
定义:<!ELEMENT 元素名 元素类型>
命名规则:
- 名称可以包含字母、数字以及其他的字符;
- 名称不能以数字或者标点符号开始;
- 名称不能以字母 xml(或者 XML、Xml 等等)开始;
- 名称不能包含空格;
漏洞原理
XXE注入,即XML外部实体注入,服务端接收和解析了来自用户端的XML数据,而又没有做严格的安全控制,从而导致XML外部实体注入。重点在于外部实体,引用了外部实体,例如:<!ENTITY 实体名 SYSTEM "URI/URL">
,如果将此处的位置URI/URL
设置为文件路径地址,服务器在解析XML的时候就会将文件内容赋值为给该实体变量,再引用此实体变量时,就会将此文件内容作为变量值泄露出来。
更多利用参考文章
XXE-Lab实验
- 登录框,尝试观察请求包,POST请求,请求体中的部分像是XML元素部分;
- 直接构造XML声明和DTD部分,引用外部实体去尝试读取
/etc/passwd
文件;
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE XL [
<!ENTITY xiaoLin SYSTEM "file:///etc/passwd">]>
并且在元素中引用外部实体参数xiaoLin
,格式:&xiaoLin;
- 放包查看回显结果。
防御
- 使用开发语言禁用外部实体;
- 过滤
SYSTEM、PUBLIC
等关键字;
参考文章
https://xz.aliyun.com/t/3357
https://www.cnblogs.com/r00tuser/p/7255939.html
https://www.cnblogs.com/backlion/p/9302528.html