如何禁用XXE处理?
禁用DOCTYPE
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
禁用外部实体声明
factory.setFeature("http://xml.org/sax/features/external-general-entities", false);factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
$doc = simplexml_load_string($xml, "SimpleXMLElement", LIBXML_NOENT); // !XXE enabled!
$doc = simplexml_load_string($xml, "SimpleXMLElement"); // XXE disabled
启用安全处理
factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
禁用实体引用扩展
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setExpandEntityReferences(false);
C/C++ Xerces库的等效功能是:
xercesc::XercesDOMParser *DOMparser = new xercesc::XercesDOMParser();
DOMparser->setCreateEntityReferenceNodes(true);
创建实体引用节点意味着实体引用不会被扩展,因此不会导致外部内容泄露。但要实现正确设置可能存在很多困难,因为这些方法名称不属于那种清晰易懂的类型,因而很容易发生概念混淆。例如,我们最近为改进OWASP C++指南做出了很多努力。之前的情况曾错误地建议将此参数设置为“false”而非“true”。
因此,如果您仍然依赖之前的OWASP建议,将激活C++规则S2755。例如,msix-packaging微软开源项目就是一个用于打包和解压MSIX包的C++工具:
扩展(或不扩展)外部实体引用这一步骤是在已获取外部内容之后进行的。因此,即使扩展被禁用并且攻击者无法窃取数据,仍然会执行对外部资源的请求。这种情况存在着安全风险,但该类风险可被视为很低,因为攻击者只能进行“盲目的SSRF”攻击。如果您认为此观点不可接受,那么您需要对上文讨论的任一解决方案进行考虑。
注:在假设XML处理器可以访问此API(https://internal.network/private/username/admin)的情况下,当攻击者欺骗服务器(在本例中为XML处理器)执行任意请求而无法检索响应内容时,就会发生盲目的SSRF。
继而攻击者可以对该API端点执行请求。在该案例的最差情况下,攻击者可能够窃取用户名信息,具体情况取决于XML处理器的错误处理程度。
结语
作者简介:
文章来源:https://blog.sonarsource.com/secure-xml-processor