安全矩阵

 找回密码
 立即注册
搜索
查看: 594|回复: 0

禁用XXE处理漫谈

[复制链接]

252

主题

252

帖子

1309

积分

金牌会员

Rank: 6Rank: 6

积分
1309
发表于 2023-3-14 16:22:01 | 显示全部楼层 |阅读模式
原文链接:禁用XXE处理漫谈

前言
近期准备面试题时,XXE漏洞防范措施(或者说修复方式)在一些文章中比较简略,
故本文根据研究进行总结,作为技术漫谈罢了。
简述XXE漏洞
XXE(XML外部实体注入),程序解析XML数据时候,同时解析了攻击者伪造的外部实体。XML用途是为了跨平台语言传输数据。常常用于WEB开发等
XXE漏洞攻防情况
通常来说,XML文档生成时会常用到XXE和内部实体。因此开发团队根据项目需求去进行防范XXE漏洞。
然而实际情况是,即使采取了防范措施(错误的方法),XXE漏洞仍然可以大行其道。
有一个案例,某开发团队针对CVE-2018-20318漏洞进行了及时的修复,依照的是官方的修复方案:
禁止实体扩展引用,dbFactory.setExpandEntityReferences(false)
然而后续XXE漏洞仍然可以奏效,有师傅又提交了CVE漏洞。
最后有师傅总结正确的修复方法,如下

禁用XXE处理分析
根据上述所说,XXE漏洞的正确处理是尤为重要的。我们这里以Java为例,
并且应用偏向于JAXP API进行分析如何禁用XXE处理
禁用文档类型
首先可以禁用文档类型。实体通过XML 文档的 DOCTYPE 进行声明。
我们在进行安全开发规划时,如确定不需要 DOCTYPE 声明时,可以完全禁用禁用文档类型。
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
当我们设置为true时,disallow-doctype-decl 使XML处理器发现DOCTYPE 声明时抛出异常。
禁用外部实体声明
其次是可以允许声明DOCTYPE,但禁用外部实体声明。
故若想要正常处理其他DTD声明,只针对外部实体进行抛出异常。可以用下面两种方法设置为flase来处理:
factory.setFeature("http://xml.org/sax/features/external-general-entities", false); factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
补充说明:在PHP中,libxml库默认下是安全的,总是禁用外部实体。除非通过设置LIBXML_NOENT
参数进行允许。如下:
$doc = simplexml_load_string($xml, "SimpleXMLElement", LIBXML_NOENT); // !XXE enabled! $doc = simplexml_load_string($xml, "SimpleXMLElement"); // XXE disabled
启用安全处理
在Java中可以使用Feature for Secure Processing (FSP)进行安全处理。如下:
factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
FSP属于一种核心Java机制,用于以应用限制去配置XML处理器,从而可以防范XML拒绝服务攻击和XXE漏洞。
默认设置下,FSP处于部分启用的状态,XML拒绝服务攻击可以防范。而XXE漏洞我们需要通过调用
setFeature方法,将FSP由部分启用转为完全启用。
不过也有特例,例如Apache Xerces中FSP不限制外部连接,无法防范XXE漏洞。
总之,开发人员应当测试涉及XXE漏洞的FSP配置,并结合其他方式来禁用或者限制XXE
禁用实体引用扩展
XML文档中寻找实体引用主要有两种方式:
(1)DOM XML解析器作值替换引用
(2)DOM树创建空实体进行引用
将实体作值替换的机制在解析恶意XML文件时,可能会泄露敏感信息。
在Java中,对象DocumentBuilder中的etExpandEntityReferences方法用于配置实体引用:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setExpandEntityReferences(false);
当配置为false时,不会进行实体引用。因而可以防范XXE漏洞。
扩展外部实体引用是发生在已提取外部内容之后。
因此禁用后且攻击者无法造成泄露敏感数据,仍然执行请求外部资源。
不过经过禁用实体引用扩展,攻击者仅能进行blind SSRF攻击,难以实际造成威胁。
所以禁用实体引用扩展也是我们防范XXE漏洞的可选方案。







回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-28 20:39 , Processed in 0.029088 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表