XXE(xml external entity -injection,xml外部实体注入)
XML文档结构:
DTD(Document Type Definition,文档类型定义,用来为XML文档定义语义约束)
-
DTD内部声明
<!DOCTYPE 根元素 [元素声明]>
-
DTD外部引用
<!DOCTYPE 根元素名称 SYSTEM "外部DTD的URI">
-
引用公共DTD
<!DOCTYPE 根元素名称 PUBLIC "DTD标识名" "公用DTD的URI">
漏洞产生原因:
漏洞产生原因
代码意义:导入外部实体,用file协议读取etc/passwd文档并赋值给f,打印f
外部引用可以支持http,file,ftp等协议
如果一个接口支持接收xml数据,且没有对xml数据做任何安全上的措施,就可能导致XXE漏洞
simplexml_load_string()函数:将xml文档转换为SimpleXMLElement对象
注:php里面解析xml用的是libxml,其在>=2.9.0的版本中,默认禁止解析xml外部实体内容
漏洞举例
- 构造一个恶意xml文档
<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY f SYSTEM "file:///c:/windows/win.ini">
]>
<x>&f;</x>
- 将恶意xml内容填入框中,发现返回了c:/windows/win.ini的内容
攻击成功。
总结
现在很多语言里面对应的解析xml的函数默认是禁止解析外部实体内容的,从而也就直接避免了这个漏洞。
防范措施:
- 禁止解析外部实体内容
- 过滤敏感文件