Xml外部实体注入漏洞(XXE)与防护

2023-11-07

Xml外部实体注入(XXE)

除了json外,xml也是一种常用的数据传输格式。对xml的解析有以下几种常用的方式:DOM,SAX,JDOM,DOM4J,StAX等。然而这几种解析方式都可能会出现外部实体注入漏洞,如微信支付的回调就出现过(见参考资料2)。

XML文档结构包括xml声明,DTD文档类型定义(可选)和文档元素,如下图所示:
这里写图片描述

DTD的作用是定义XML文档的合法构建模块,可以在XML文档内声明,也可以外部引用。当DTD引用外部实体,而外部实体中含有恶意代码时,就可能会在解析xml时执行外部实体中的恶意代码。这就是xml外部实体注入。

举个简单的栗子如下图所示:
这里写图片描述

这里通过引用外部实体,读取了/etc/passwd。详细的例子见参考资料1。

XXE防护

DOM解析防护(JAXP DocumentBuilderFactory, SAXParserFactory and DOM4J)

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException; // catching unsupported features
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
String FEATURE = null;
try {
	// 首要选择。不允许DTDs,几乎可以阻止所有的XML实体攻击
	FEATURE = "http://apache.org/xml/features/disallow-doctype-decl";
	dbf.setFeature(FEATURE, true);
} catch (ParserConfigurationException e) {
	// This should catch a failed setFeature feature
	logger.info("ParserConfigurationException was thrown. The feature '" +
	FEATURE + "' is probably not supported by your XML processor.");
} catch (SAXException e) {
	// On Apache, this should be thrown when disallowing DOCTYPE
	logger.warning("A DOCTYPE was passed into the XML document");
} catch (IOException e) {
	// XXE that points to a file that doesn't exist
	logger.error("IOException occurred, XXE may still possible: " + e.getMessage());
}
DocumentBuilder safebuilder = dbf.newDocumentBuilder();
	
如果不能完全禁用DTDs,那么至少使用以下方案:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
String FEATURE = null;
try {
	// If you can't completely disable DTDs, then at least do the following:
	// Xerces 1 - http://xerces.apache.org/xerces-j/features.html#external-general-entities
	// Xerces 2 - http://xerces.apache.org/xerces2-j/features.html#external-general-entities
	// JDK7+ - http://xml.org/sax/features/external-general-entities 
	FEATURE = "http://xml.org/sax/features/external-general-entities";
	dbf.setFeature(FEATURE, false);
	
	// Xerces 1 - http://xerces.apache.org/xerces-j/features.html#external-parameter-entities
	// Xerces 2 - http://xerces.apache.org/xerces2-j/features.html#external-parameter-entities
	// JDK7+ - http://xml.org/sax/features/external-parameter-entities 
	FEATURE = "http://xml.org/sax/features/external-parameter-entities";
	dbf.setFeature(FEATURE, false);
	
	// Disable external DTDs as well
	FEATURE = "http://apache.org/xml/features/nonvalidating/load-external-dtd";
	dbf.setFeature(FEATURE, false);
	
	// 此处依据为Timothy Morgan's 2014的论文: "XML Schema, DTD, and Entity Attacks"
	dbf.setXIncludeAware(false);
	dbf.setExpandEntityReferences(false);
	
    // 以下注意点同样出自Timothy Morgan's的论文
	// If for some reason support for inline DOCTYPEs are a requirement, then 
	// ensure the entity settings are disabled (as shown above) and beware that SSRF attacks
	// (http://cwe.mitre.org/data/definitions/918.html) and denial 
	// of service attacks (such as billion laughs or decompression bombs via "jar:") are a risk."
	
	// remaining parser logic
} catch (ParserConfigurationException e) {
	// This should catch a failed setFeature feature
	logger.info("ParserConfigurationException was thrown. The feature '" +
	FEATURE + "' is probably not supported by your XML processor.");
} catch (SAXException e) {
	// On Apache, this should be thrown when disallowing DOCTYPE
	logger.warning("A DOCTYPE was passed into the XML document");
} catch (IOException e) {
	// XXE that points to a file that doesn't exist
	logger.error("IOException occurred, XXE may still possible: " + e.getMessage());
}
DocumentBuilder safebuilder = dbf.newDocumentBuilder();

其他解析方式的xxe防护见官方文档(参考资料3),里面写得很详细,这里就不复制了。

参考资料:

[1].https://www.cnblogs.com/miyeah/p/4526088.html。
[2].https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=23_5
[3].https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Prevention_Cheat_Sheet#SAXTransformerFactory

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Xml外部实体注入漏洞(XXE)与防护 的相关文章

随机推荐

  • 【标准解读】Autosar 复杂驱动(CDD)开发--看这一篇就够了

    系列文章目录 提示 写完文章后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 系列文章目录 前言 一 Introduction to CDD 二 CDD设计建议 CDD开发需要注意的事项 2 1 文档 2 2行为和接口描述 2
  • Netty线程模型

    说明 1 Netty抽象出两组线程池 BossGroup专门负责接收客户端的链接 WorkerGroup专门负责网络的读写 2 BossGroup和WorkerGroup类型都是NioEventLooGroup 3 NioEventLoog
  • (转)非常好的WebApi入门文章

    如何在VS中创建基于 NET的后端应用程序 该应用程序使用C 语言从Web API中提取 让我们开始吧 为服务器后端逻辑选择语言的问题是几乎每个开发人员最重要的问题之一 特别是对于初学者 目前已经有很多不同的语言 Java NET C VD
  • 嵌入式数据结构(栈)

    嵌入式自学笔记 1 2 后进先出 3 栈的应用 从A出发进是入栈 红色的出是出栈 4 创建栈的思路 zhan zhancreat int len zhan s if s zhan malloc sizeof zhan NULL printf
  • css选择class中的第一个怎么选?使用first-of-type?

    Dom结构 div span class hha 我是span span h1 class hha 我是h1 h1 h1 我是h1 h1 h1 class hha 我是h1 h1 h1 class hha 我是h1 h1 h1 我是h1 h
  • 如何限制同一客户端登录的用户数量以及禁止同一用户同时在不同客户端登录?

    在web应用系统中 出于安全性考虑 经常需要对同一客户端登录的用户数量和一个客户同时在多个客户端登陆进行限制 具体一点就是 1 在同一台电脑上一次只允许有一个用户登录系统 2 一个用户在同一时间只允许在一个客户端登录 我最近做的一个系统就遇
  • Linux基本命令(二) 文件处理命令

    文件处理命令 touch 命令名称 touch 命令所在路径 bin touch 执行权限 所有用户 语法 touch 文件名 功能描述 创建空文件 范例 touch chen list 文件处理命令 cat 命令名称 cat 命令所在路径
  • UE4 中C++读取Json文件

    本篇文章介绍C 读取Json文件前我们先了解下Json格式 Json格式不同读取会有所区别 踩了一波坑 Json文件有三种格式 这三种格式都是正确的 这边提供一个很有用的Json文件在线编辑平台的网址 在线编辑Json网站 Json文件的三
  • STM32----中断优先级设置

    步骤一 设置中断分组 STM32中断规则 中断优先级分为抢占式优先级和子优先级 对于每一个中断需事先设置其抢占式优先级和子优先级 抢占式优先级级别高的中断可以打断抢占式优先级级别地的中断 抢占式优先级级别相同时 互相均不能打断对方中断执行
  • 计算机专业考研复试上机算法学习

    计算机专业考研复试上机算法学习 这篇博客是博主在准备可能到来的线下上机复试基于王道机试指南的学习 将各道习题链接和代码记录下来 这篇博客权且当个记录 文章目录 计算机专业考研复试上机算法学习 1 STL容器学习 1 1 vector动态数组
  • 网络爬虫之css选择器

    文章目录 通过id class选择元素 元素内部筛选 通过属性值筛选 取值 参考 通过id class选择元素 container 选择id为container的元素 container 选择所有class包含container的元素 di
  • 你不知道的JavaScript-----强制类型转换

    目录 值类型转换 抽象值的操作 JSON 字符串化 ToNumber 非数字值到数字值 Number value ToBoolean 转换为布尔类型 Boolean value 强制类型转换 字符串和数字之间的显式强制类型转换 奇特的 运算
  • Eclipse/MyEclipse闪退之后打不开工作空间的问题解决

    Eclipse MyEclipse闪退之后打不开工作空间的问题解决 在开发过程中偶尔会出现Eclipse MyEclipse闪退之后再启动时打不开工作空间的情况 可以这样解决 1 找到工作空间的目录 例如 E workspace 2 再进入
  • code review

    方法有多种 目前最被认可或运用的方法莫过于CodeReview活动了 那么 CodeReview到底能给团队带来什么 什么样的团队需要进行CodeReview活动 如何有效开展CodeReview活动 用哪种方式会比较好呢 笔者为了接地气地
  • 工业物联网的巨控GRM530无线模块与西门子PLC通信,远程上下载程序

    西门子逆天技术出来了 西门子smart200PLC的数据无线远程传输到上位机 手机APP 概述 随着移动互联网的普及 越来越多的用户希望通过智能手机APP监控工业现场PLC的各种状态 报警等数据 通过手机APP来实现减少人力的投入 还可以实
  • vue中属性key的作用(了解diff),为什么不建议index作为key

    1 官方文档有关key的说明 key 的特殊 attribute 主要用在 Vue 的虚拟 DOM 算法 在新旧 nodes 对比时辨识 VNodes 如果不使用 key Vue 会使用一种最大限度减少动态元素并且尽可能的尝试就地修改 复用
  • 一篇搞定,Kettle详细教程

    文章目录 第一章 Kettle概述 1 1 Kettle发展历程 1 2 Kettle简介 1 3 Kettle相关俗语 1 4 Kettle设计与组成 1 5 Kettle功能模块 1 6 Kettle的执行 Transformation
  • OPT3001光强传感器驱动实现(STM32F407)

    上面是我的微信和QQ群 欢迎新朋友的加入 写了个光强传感器的代码 产品特点 精密光学滤波以匹配人眼 拒绝IR gt 99 典型值 自动满量程设定功能简化了软件 并确保正确的配置 0 01勒克斯至83K勒克斯 23位有效动态范围 自动增益范围
  • 批量汇总nmon结果文件Excel数据

    1 原由 在使用nmon监控服务器资源以后 因为服务器较多 生成了几十个结果文件 现在需要统计每个文件中cpu 内存 disk等平均值 最大值信息 太多表了 就写了个Python脚本 以后可能用的上 先记录一下 nmon生成的Excel中
  • Xml外部实体注入漏洞(XXE)与防护

    Xml外部实体注入 XXE 除了json外 xml也是一种常用的数据传输格式 对xml的解析有以下几种常用的方式 DOM SAX JDOM DOM4J StAX等 然而这几种解析方式都可能会出现外部实体注入漏洞 如微信支付的回调就出现过 见