XML外部实体引用(XXE,XML External Entity attack)漏洞原理及其预防

0x00 什么是XML

XML 指可扩展标记语言(EXtensible Markup Language),是一种用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。和HTML类似,但HTML被设计来显示数据,XML被设计来传输数据。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。

https://mp.csdn.net/postedit

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外部实体注入漏洞原理

扫描二维码关注公众号,回复: 1040797 查看本文章

许多较早的或配置错误的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

猜你喜欢

转载自blog.csdn.net/qq_gfq/article/details/79697861