xxe
XXE
xml external entity injection
xml外部实体注入
概述
xml是可扩展的标记语言,涉及被用来传输、存储数据
html被用来显示数据
其中xml的标签没有预定义的,允许作者自己定义标签和文档结构。
组成
声名
<?xml version="1.0" encoding="UTF-8"?>
以上实例包含 XML 版本(
UTF-8 也是 HTML5, CSS, JavaScript, PHP, 和 SQL 的默认编码。
XML DTD
文档类型定义DTD(document type definition),是下面文档元素的规定可以叫约束,定义了格式
<!DOCTYPE note SYSTEM "Note.dtd">
DOCTYPE 声明是对外部 DTD 文件的引用
文档元素
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
利用
其中我们能利用的是DTD部分引入外部文档
xml文档定义语义约束
有三种方法
- DTD内部声名:
- DTD外部声名:其中外部引用支持http、file和ftp等
- 引用公共DTD:
<!DOCTYPE note
[
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
如果一个接口支持接受xml数据,且没有对xml数据做任何安全上的措施,就可能导致xxe漏洞。
libxml在2.9.0(包含)之后默认禁止解析xml默认实体内容的。
用例
<?xml cersion="1.0">
<!DOCTYPE hack [
<!ENTITY xxe SYSTEM "file:///etc/password">
]>
<hack>&xxe;</hack>
"%name"(参数实体)实在DTD中被引用,而"&name;"是在xml文档中被引用的。
能怎么利用看支持什么协议,具体的参考
https://security.tencent.com/index.php/blog/msg/69
防御
方案一、使用开发语言提供的禁用外部实体的方法
PHP:
libxml_disable_entity_loader(true);
其他语言:
https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Prevention_Cheat_Sheet
方案二、过滤用户提交的XML数据
关键词:,SYSTEM和PUBLIC。
参考:
https://security.tencent.com/index.php/blog/msg/69