XML External Entity Injection(XXE)
写在前面
安全测试fortify扫描接口项目代码,暴露出标题XXE的问题, 记录一下。官网链接:
https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Prevention_Cheat_Sheet#JAXP_DocumentBuilderFactory.2C_SAXParserFactory_and_DOM4J
摘要
使用配置的 XML 解析器无法预防和限制外部实体进行解析,这会使解析器暴露在 XML External Entities 攻击之下。
解释
XML External Entities 攻击可利用能够在处理时动态构建文档的 XML 功能。XML 实体可动态包含来自给定资源的数据。外部实体允许 XML 文档包含来自外部 URI 的数据。除非另行配置,否则外部实体会迫使 XML 解析器访问由 URI 指定的资源,例如位于本地计算机或远程系统上的某个文件。这一行为会将应用程序暴露给XML External Entity (XXE) 攻击,从而用于拒绝本地系统的服务,获取对本地计算机上文件未经授权的访问权限,扫描远程计算机,并拒绝远程系统的服务。 下面的 XML 文档介绍了 XXE 攻击的示例。
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE foo [ <!ELEMENT foo ANY > <!ENTITY xxe SYSTEM "file:///dev/random" >]><foo>&xxe;</foo>
如果 XML 解析器尝试使用 /dev/random 文件中的内容来替代实体,则此示例会使服务器(使用 UNIX 系统)崩溃。
建议
应对 XML 解析器进行安全配置,使它不允许将外部实体包含在传入的 XML 文档中。 为了避免 XXEinjections,应为 XML 代理、解析器或读取器设置下面的属性:
factory.setFeature("http://xml.org/sax/features/external-general-entities",false); factory.setFeature("http://xml.org/sax/features/external-parameter-entities",false);
如果不需要 inline DOCTYPE 声明,可使用以下属性将其完全禁用:
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl",true);
要保护 TransformerFactory,应设置下列属性:
TransformerFactory transFact = TransformerFactory.newInstance(); transFact.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); Transformer trans = transFact.newTransformer(xsltSource); trans.transform(xmlSource, result);
或者,也可以使用安全配置的 XMLReader 来设置转换源:
XMLReader reader = XMLReaderFactory.createXMLReader(); reader.setFeature("http://xml.org/sax/features/external-general-entities",false); reader.setFeature("http://xml.org/sax/features/external-parameter-entities",false); Source xmlSource = new SAXSource(reader, new InputSource(new FileInputStream(xmlFile))); Source xsltSource = new SAXSource(reader, new InputSource(new FileInputStream(xsltFile))); Result result = new StreamResult(System.out); TransformerFactory transFact = TransformerFactory.newInstance(); Transformer trans = transFact.newTransformer(xsltSource); trans.transform(xmlSource, result);
感谢
参考
-
https://cheatsheetseries.owasp.org/cheatsheets/XML_External_Entity_Prevention_Cheat_Sheet.html (官网)
-
https://docs.microsoft.com/zh-cn/dotnet/api/javax.xml.xmlconstants.featuresecureprocessing?view=xamarin-android-sdk-9
-
https://saxonica.plan.io/issues/2414
-
https://stackoverflow.com/questions/18942307/warning-jaxp-feature-xmlconstants-feature-secure-processing-on-jersey2-x-client
-
https://bbs.csdn.net/topics/394382326 (XMLConstants.ACCESS_EXTERNAL_DTD的值)
-
https://docs.oracle.com/javase/7/docs/api/javax/xml/XMLConstants.html
-
https://stackoverflow.com/questions/25453042/how-to-disable-accessexternaldtd-and-entityexpansionlimit-warnings-with-logback
-
http://www.java2s.com/Code/Jar/j/Downloadjaxpapijar.htm (jaxp jar包)
作者:习惯沉淀
如果文中有误或对本文有不同的见解,欢迎在评论区留言。
如果觉得文章对你有帮助,请点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
扫码关注一线码农的学习见闻与思考。
回复"大数据","微服务","架构师","面试总结",获取更多学习资源!