注⼊攻击与防御_XXE(Web漏洞及防御)
XEE:XML External Entity(XML外部实体)
(注意:XEE与XML注⼊、XPATH注⼊漏洞不⼀样的!)
XML:可扩展标记语⾔,⽤来结构化,存储以及传输信息!
使用dom4j解析xml文件XML⽂档结构:
1. XML声明
2. ⽂档类型定义(Document Type Definition,DTD,可选项)
3. ⽂档元素
DTD:⽤来约束⼀个XML⽂档的书写规范!
1. 定义元素
(对应XML中的标签)
2. 定义实体
(对应XML标签中的内容)
内部定义:将⽂档类型定义直接放在XML⽂档中
DOCTYPE note:定义此⽂档是note类型的⽂档!
ELEMENT note(to,from,heading,body)定义note有4个元素:to,from,heading,body!
ELEMENT to(#PCDATA)定义to元素为#PCDATA类型......
假如DTD⽂档位于XML源⽂件的内部:
通过引⽤【外部⽂档说明】的⽅式进⾏引⽤!
外部引⽤:
⽂档类型定义的内容可以保存为单独的DTD⽂档
1. DTD⽂档在本地
⽤SYSTEM标识,并写上”DTD的⽂件路径”,如下:
2. DTD⽂档在公共⽹络上⽤PUBLIC标识,如下:称" "DTD⽂件的URL">
DTD实体声明
1. 内部实体声明
2. 外部实体声明
3. 参数实体声明
4. 引⽤公共实体
漏洞产⽣的原因
XXE是⼀种针对应⽤程序的解析XML输⼊的攻击,当输⼊包含外部实体引⽤的XML⽂件到未进⾏安全配置的XML解析器中时,易产⽣此类攻击!
XXE的利⽤
1. 泄漏本地⽂件
// 通过加载外部实体,利⽤file://、php://等伪协议读取本地⽂件
2. CSRF/SSRF攻击
// 攻击者使⽤受信任的应⽤程序来攻击内部的其他系统,通过HTTP请求或内部服务发起SSRF攻击
3. 命令执⾏
expect://系统标识符执⾏系统命令
4. 拒绝服务
// 执⾏特定的操作占⽤系统⼤量内存,从⽽造成系统瘫痪!
5. 内⽹端⼝探测
// 访问特定的端⼝,来探测端⼝是否开放!
注意:具体实例,会在<>篇详解!
XEE防御
1. 禁⽤DTD中外部实体
防⽌外部实体的注⼊!
libxml_disable_loader(true)
2. 过滤⽤户提交的XML数据
过滤关键字:
SYSTEM
PUBLIC
......
补充
XML解析器
DOM解析⽅式
SAX解析⽅式
JDOM
DOM4J
各种解析⽅式的⼯作原理,都⽀持外部实体的引⽤,因此防御过程中,⼀般都禁⽤对DTD的⽀持,需要⽀持的话,⼀定要禁⽤对DTD中外部实体引⽤的⽀持!