0x00 什么是XML
XML 指可扩展标记语言(EXtensible Markup Language),是一种用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。和HTML类似,但HTML被设计来显示数据,XML被设计来传输数据。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。
0x01 什么是XML外部实体
DTD(文档类型定义)的作用是定义XML文档的合法构建模块,DTD可以在XML文档内声明,也可以在外部引用。
内部声明DTD:<!DOCTYPE 根元素 [元素声明]}>;引用外部DTD:<!DOCTYPE 根元素 SYSTEM “文件名”> 或者<!DOCTYPE 根元素 PUBLIC “public_ID” “文件名”>。
DTD实体是用于定义引用普通文本或特殊字符的快捷方式的变量,可以内部声明或外部引用。
内部声明实体:<!ENTITY 实体名称 “实体的值”>;引用外部实体:<!ENTITY 实体名称 SYSTEM “URI”>。或者<!ENTITY 根元素 PUBLIC “public_ID” “URI”>。
上面代码中,XML外部实体“el”被赋值为“file:///etc/passwd”。在解析XML文档时,关键字SYSTEM会告知XML解析器‘el’实体的值从URI文件里面的内容获取到。
0x03 XXE外部实体注入漏洞原理
许多较早的或配置错误的XML处理器评估了XML文件中的外部实体引用,关键字SYSTEM会使XML解析器从URI中读取内容,并允许它在XML文档中被替换。所以,攻击者就能通过实体将自定义的值发送给应用程序,这样就能构造恶意内容,导致任意文件读取、系统命令执行、攻击内网等危害。
引入外部实体的方式有多种,如:
1.内部声明DTD直接引用:
2.内部声明DTD间接引用:
test.dtd文件内容:
3.引用外部DTD:
test2.dtd内容:
0x04 XXE预防
尽可能使用简单的数据格式(如JSON),避免对敏感数据进行序列化。
及时修复或更新应用程序或底层操作系统使用的所有XML处理器和库。同时通过依赖性检测,将SOAP更新到1.2及以上版本。
在应用程序的所有XML解析器中禁用XML外部实体和DTD进程。
在服务器实施积极的(“白名单”)输入验证、过滤和消毒,以防止在XML文档、标题或节点中出现恶意数据。
验证XML或XSL文件上传功能是否使用XSD验证或其他类似验证方法来验证上传的XML文件。
及时利用工具预防和检测XXE漏洞,SAST可以检测源代码中的XXE漏洞。
0x05 参考文献
https://security.tencent.com/index.php/blog/msg/69