XXE 漏洞简单研究
近期在做个基础的 web 常见漏洞的 ppt,主要参考 OWASP TOP 10 2017RC2,此版本中增加了 XXE 攻击,所以自己简单的研究下 XXE 攻击。XXE(XML External Entity)XML 外部实体,当前端和后端通信数据采用 xml,可传入 xml 外部实体,利用后端 xml 解析器漏洞,使 xml 解析器去访问攻击者指定的资源。首先需要了解一些 xml 的基础知识。
1.xml 基础知识
XML 用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML 文档结构包括 XML 声明、DTD 文档类型定义(可选)、文档元素。
XML 具有一些特性:
(1).XML 是一种标记语言,很类似 HTML
(2).XML 被设计用来传输和存储数据,而 HTML 被设计用来显示数据
(3).XML 标签没有被预定义,需要用户自行定义标签
(4).XML 具有自我描述性
XML 的语法规则:
(1).XML 必须有一个根元素
(2).XML 必须有关闭标签
(3).XML 标签对大小写敏感
(4).XML 元素必须正确的嵌套
(5).XML 属性值必须加引号
XML DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。它使用一系列的合法元素来定义文档结构。DTD 可以在 XML 文档内声明,也可以外部引用。
(1)内部声明:<!DOCTYPE 根元素 [元素声明]>,例如 <!DOCTYPE note aaa>
(2)外部声明:<!DOCTYPE 根元素 SYSTEM "文件名">,例如 <!DOCTYPE root SYSTEM "test.dtd">
DTD 实体声明:
(1)内部实体声明
<!ENTITY 实体名称 “实体的值”>
示例:
<!DOCTYPE foo [
<!ELEMENT foo ANY> <!-- 声明元素 -->
<!ENTITY test "abcdefg"> <!-- 声明内部实体 -->
<!ENTITY xxe "Thinking"> <!-- 声明内部实体 -->
]>
<foo>&xxe;&test;</foo>
(2)外部实体声明
<!ENTITY 实体名称 SYSTEM “URI/URL”>
外部实体声明支持的部分协议如下:

<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini"> <!-- 声明外部实体 -->
]>
<foo>&xxe;</foo>
(3)参数实体声明
参数实体的引用只能在 DTD 中使用
<!ENTITY % 实体名 “实体内容”>
<!ENTITY % 实体名 SYSTEM “URI”>
详情见:http://www.w3school.com.cn/dtd/index.asp
2.XXE 攻击
xxe 主要利用 xml 解析器对外部实体的解析去触发攻击,从上面支持的协议列表可以看出,可利用 xxe 去进行命令执行、读取文件、内网探测端口、作为跳板机攻击内网机器等攻击,故危害巨大。
xxe 主要分为两种场景:有回显和无回显。有回显的场景中,可以直接查看到攻击执行的结果。无回显的场景下,只能通过其他手段查看攻击效果。这次主要实验了有回显的情况。
自己编写个简单的登录场景,登录的参数使用 xml 传输,后端对接收的 xml 参数进行解析,并且返回登录情况。制作个登录,当点击 “登录” 按钮时,使用 ajax 传输 xml 格式的登录信息,
传输的数据格式为:<login><username > 用户名 </username><password > 密码 </password></login>


后端使用 dom4j 去解析传入的 xml 参数,为了实现有回显的效果,我们将传入的 username 回传给前端,并在前端显示出来。
@Controller
@RequestMapping(value="api")
public class XXEController {/*<login><username>aaa</username><password>adfasds</password></login>*/@ResponseBody@RequestMapping(value="loginXml.json"/*,method= RequestMethod.POST*/)public AjaxResponse testXXE(String xml){AjaxResponse ajaxResponse = new AjaxResponse();try {Document document = DocumentHelper.parseText(xml);Element rootEle = document.getRootElement();String username = rootEle.elementTextTrim("username");//String password = rootEle.elementTextTrim("password");ajaxResponse.setCode(210);ajaxResponse.setMsg("登录失败");ajaxResponse.setContent(username);}catch (Exception e){e.printStackTrace();ajaxResponse.setCode(211);ajaxResponse.setMsg("数据处理失败");}return ajaxResponse;}}
正常登陆时,传输的参数和回显效果如下:

xml=%3Clogin%3E%3Cusername%3Eadmin%3C%2Fusername%3E%3Cpassword%3Etest123%3C%2Fpassword%3E%3C%2Flogin%3E

使用 xxe 攻击时,攻击示例代码如下,此代码读取 c:/windows/win.ini 文件
<!DOCTYPE foo
[<!ELEMENT foo ANY>
<!ENTITY abc SYSTEM "file:///c:/windows/win.ini">]>
<login><username>&abc;</username><password>fdsf</password></login>
修改参数和回显效果如下:


3. 防御措施
关于防御措施,第一种可以关闭 xml 解析器外部解析功能,第二种进行过滤,例如过滤掉!、DOCTYPE、SYSTEM、ENTITY 等关键字
尝试下第二种方案,过滤关键字。后端代码如下,将部分关键字过滤掉。
@Controller
@RequestMapping(value="api")
public class XXEController {/*<login><username>aaa</username><password>adfasds</password></login>*/@ResponseBody@RequestMapping(value="loginXml.json"/*,method= RequestMethod.POST*/)public AjaxResponse testXXE(String xml){AjaxResponse ajaxResponse = new AjaxResponse();try {//过滤部分关键字,防止XXEString newXml = xml.replace("!","").replace("DOCTYPE","").replace("ELEMENT","").replace("ENTITY","");Document document = DocumentHelper.parseText(newXml);Element rootEle = document.getRootElement();String username = rootEle.elementTextTrim("username");//String password = rootEle.elementTextTrim("password");ajaxResponse.setCode(210);ajaxResponse.setMsg("登录失败");ajaxResponse.setContent(username);}catch (Exception e){e.printStackTrace();ajaxResponse.setCode(211);ajaxResponse.setMsg("数据处理失败");}return ajaxResponse;}}



可以看到,将关键字过滤(替换成 “”),会导致传入的数据不符合 xml 的格式,后端在 xml 解析器在解析数据时,直接出错并跳转到异常处理代码段,证明这样过滤是有效的。以上为一次简单的研究 xxe,后续有待深入研究。
相关文章:
XXE 漏洞简单研究
近期在做个基础的 web 常见漏洞的 ppt,主要参考 OWASP TOP 10 2017RC2,此版本中增加了 XXE 攻击,所以自己简单的研究下 XXE 攻击。XXE(XML External Entity)XML 外部实体,当前端和后端通信数据采用 xml&…...
web漏洞与规避
文章目录 一、XSS 跨站脚本攻击1.1 XSS攻击的主要类型反射型XSS存储型XSSDOM型XSS 1.2 前端开发如何应对XSS 二、CSRF 跨站请求伪造2.1 CSRF例子2.2 前端开发如何应对CSRF 三、SQL 注入3.1 前端如何防御SQL注入 四、前端如何使用CSP 一、XSS 跨站脚本攻击 攻击者通过在受害者的…...
#FPGA(基础知识)
1.IDE:Quartus II 2.设备:Cyclone II EP2C8Q208C8N 3.实验:正点原子-verilog基础知识 4.时序图: 5.步骤 6.代码:...
LockBit病毒入侵揭秘:如何防范与应对
在数字时代,随着科技的飞速发展,网络安全问题愈发凸显。恶意软件和勒索软件等网络威胁正不断演变,其中一款备受关注的勒索软件就是LockBit。本文将深入介绍LockBit的特征、攻击手段、演进历程以及对网络安全的威胁。 01 主要特征 LockBit是…...
vue-router4 (六) 路由嵌套
应用场景: ①比如京东页面的首页、购物车、我的按钮,可以点击切换到对应的页面; ② 比如 Ant Design左侧这些按钮点击就会切到对应的页面,此时可以把左侧按钮放在父路由中,右侧的子路由 1.路由配置,子路由…...
【NR 定位】3GPP NR Positioning 5G定位标准解读(一)
目录 前言 1. 3GPP规划下的5G技术演进 2. 5G NR定位技术的发展 2.1 Rel-16首次对基于5G的定位技术进行标准化 2.2 Rel-17进一步提升5G定位技术的性能 3. Rel-18 关于5G定位技术的新方向、新进展 3.1 Sidelink高精度定位功能 3.2 针对上述不同用例,3GPP考虑按…...
【AI绘画】免费GPU Tesla A100 32G算力部署Stable Diffusion
免责声明 在阅读和实践本文提供的内容之前,请注意以下免责声明: 侵权问题: 本文提供的信息仅供学习参考,不用做任何商业用途,如造成侵权,请私信我,我会立即删除,作者不对读者因使用本文所述方法…...
JVM(2)
JVM类加载 指的是java进程运行时,需要把.class文件从硬盘加载到内存,并进行一系列校验解析的过程. 核心: .class文件>类对象; 硬盘>内存. 类加载过程 在整个JVM的执行流程中,和程序员关系最密切的就是类加载的过程了,所以我们来看一下类加载的执行流程. 对于一个类…...
青少年CTF擂台挑战赛 2024 #Round 1 Web方向题解 WP 全
EasyMD5 题目描述:php没有难题 考点总结:脑洞题目,不如我出(狗头 只允许两个都上传pdf文件。 文件还不能太大了。burp多次发包发现要求两个pdf内容不一样 不一样时候,提示我们MD5碰撞。 科学计数法绕过 PHP的后门 …...
一文认识蓝牙(验证基于Aduino IDE的ESP32)
1、简介 蓝牙技术是一种无线通信的方式,利用特定频率的波段(2.4GHz-2.485GHz左右),进行电磁波传输,总共有83.5MHz的带宽资源。 1.1、背景 蓝牙(Bluetooth)一词取自于十世纪丹麦国王哈拉尔Haral…...
2W字-35页PDF谈谈自己对QT某些知识点的理解
2W字-35页PDF谈谈自己对QT某些知识点的理解 前言与总结总体知识点的概况一些笔记的概况笔记阅读清单 前言与总结 最近,也在对自己以前做的项目做一个知识点的梳理,发现可能自己以前更多的是用某个控件,以及看官方手册,但是没有更…...
Docker知识点总结
二、Docker基本命令: Docker支持CentOs 6 及以后的版本; CentOs7系统可以直接通过yum进行安装,安装前可以 1、查看一下系统是否已经安装了Docker: yum list installed | grep docker 2、安装docker: yum install docker -y -y 表示自动确认…...
Redis 消息队列:构建消息代理的 4 个简单步骤
消息代理是一种使系统、应用程序和服务能够通信和交换信息的软件。它在正式消息传递协议之间转换消息,并允许相互依赖的服务直接“对话”,即使是用不同语言编写或在不同平台上实现也是如此。在微服务中使用异步通信时,通常会使用消息代理。 消息代理可确保可靠且稳定的通信,…...
kafka三节点集群平滑升级过程指导
一、前言 Apache Kafka作为常用的开源分布式流媒体平台,可以实时发布、订阅、存储和处理数据流,多用于作为消息队列获取实时数据,构建对数据流的变化进行实时反应的应用程序,已被数千家公司用于高性能数据管道、流分析、数据集成和任务关键型…...
Golang 简介与基本语法学习
Go,也被称为 Golang,是一门由 Google 设计的开源编程语言。它旨在提供高效的开发体验,同时具备并发性、内存安全和简洁性。本篇博客将介绍 Golang 的基本语法和一些示例,帮助读者快速入门这门令人着迷的语言。 简介 Go 语言的设…...
深入理解网络通信基本原理和tcp/ip协议
深入理解网络通信基本原理和tcp/ip协议 一、计算机网络体系1,计算机网络体系结构2,网络中数据传输2.1,浏览器中输入一个url的执行流程2.2,数据在网络中是的传输流程 3,三次握手和四次挥手3.1,三次握手3.1.1…...
Jetson系统烧录环境搭建
一 序言 Jetson 系列产品烧录系统的方法一般有两种,一种为使用 NVIDIA 官方提供 的 SDK manager 软件给 Jetson 设备烧录系统(请查看说明文档《Jetson 产品使用 SDKmanager 烧录系统》)。另一种即为当前文档所描述的,在安装 Ubun…...
【MySQL】:约束全解析
🎥 屿小夏 : 个人主页 🔥个人专栏 : MySQL从入门到进阶 🌄 莫道桑榆晚,为霞尚满天! 文章目录 📑前言一. 约束概述二. 约束演示三. 外键约束3.1 介绍3.2 语法3.3 删除/更新行为 &…...
设计一基于Text generation web UI的语言模型部署与远程访问的方案
前言 Text generation web UI可为类ChatGPT的大型语言模型提供能够快速上手的网页界面,不仅可以提高使用效率,还可满足私有化部署,或对模型进行自定义。目前,该Web UI已经支持了许多流行的语言模型,包括LLaMA、llama.…...
大数据概述
学习大数据有什么用? 2010年:大数据技术体系开始在国内火热 2015年:国务院印发《促进大数据发展行动纲要》 2016年:发改委发布关于组织实施促进大数据发展重大工程的通知 2017年:工信部印发大数据产业规划(2016-20…...
汽车故障诊断仿真教学软件【哈弗M6PLUS】:技术架构、功能实现与落地实践
在职业教育汽车专业数字化实训转型进程中,长城哈弗M6PLUS作为院校主流实训车型,其故障诊断教学长期面临诸多落地难题:实车故障设置繁琐、损耗率高,抽象的诊断流程难以可视化;传统仿真软件普遍存在车型对标度不足、故障…...
Omni-Vision Sanctuary 长短期记忆网络应用:时间序列预测与文本生成
Omni-Vision Sanctuary 长短期记忆网络应用:时间序列预测与文本生成 1. 序列数据处理的挑战与机遇 在当今数据驱动的世界中,序列数据无处不在——从股票市场的价格波动到人类语言的文字排列,再到视频中的连续帧。这些数据都有一个共同特点&…...
值类型与引用类型:别再只背“栈和堆”了,看这 个实际影响颜
基础示例:单工作表 Excel 转 TXT 以下是将一个 Excel 文件中的第一个工作表转换为 TXT 的完整步骤: 1. 加载并读取Excel文件 from spire.xls import * from spire.xls.common import * workbook Workbook() workbook.LoadFromFile("示例.xlsx"…...
OpenClaw模型热切换:Qwen3-14b_int4_awq与ChatGLM3动态路由实验
OpenClaw模型热切换:Qwen3-14b_int4_awq与ChatGLM3动态路由实验 1. 为什么需要模型热切换 上周我在处理一个自动化任务时遇到了典型困境:让OpenClaw帮我生成Python爬虫代码时,ChatGLM3给出的方案总是过于保守;而让它写产品文案时…...
OpenClaw替代方案:当Kimi-VL-A3B-Thinking不可用时的应急处理
OpenClaw替代方案:当Kimi-VL-A3B-Thinking不可用时的应急处理 1. 为什么需要制定模型故障应对策略 上周五凌晨3点,我被一阵急促的报警声惊醒。手机屏幕上闪烁着OpenClaw的异常通知——我部署的Kimi-VL-A3B-Thinking模型服务突然不可用。这个模型负责处…...
零基础玩转GLM-OCR:单卡4090一键部署,纯文本/公式/表格全能解析
零基础玩转GLM-OCR:单卡4090一键部署,纯文本/公式/表格全能解析 1. 工具概览:你的全能文档解析助手 想象一下,你手头有一堆扫描的PDF、照片或截图,里面有重要文字、复杂公式和结构化表格。传统OCR工具要么识别不准&a…...
2026年智能码牌服务商,究竟合不合法合规?
在数字支付行业蓬勃发展的今天,智能码牌服务商逐渐成为市场的焦点。随着2026年的到来,人们对于这些服务商的合法合规性愈发关注。以财联支付为例,我们来深入探讨智能码牌服务商的合法合规性问题。一、合法合规的基础:技术与资质双…...
Android Jetpack Compose - 修饰符顺序的影响、Divider(分隔线)、DropdownMenu(下拉菜单)、NavigationBar(导航栏)
一、修饰符顺序的影响 红色背景区域:200 - 50 * 2 100 * 100 dp,点击区域:200 - 50 * 2 100 * 100 dp val context LocalContext.currentBox(Modifier.size(200.dp).padding(50.dp).background(Color.Red).clickable {Toast.makeText(cont…...
OpenClawAPI封装:将SecGPT-14B能力集成到现有安全工具链
OpenClaw API封装:将SecGPT-14B能力集成到现有安全工具链 1. 为什么需要API封装 去年我在构建自动化安全审计系统时,发现很多团队面临一个共同困境:虽然本地部署了大模型,但模型能力始终无法真正融入现有工作流。SecGPT-14B作为…...
OpenClaw+Qwen3.5-9B组合优势:3个不可替代的使用场景
OpenClawQwen3.5-9B组合优势:3个不可替代的使用场景 1. 为什么选择OpenClawQwen3.5-9B组合 去年夏天,当我第一次尝试用Python脚本自动化处理医疗研究数据时,遇到了一个尴尬的问题:要么忍受公有云API的数据隐私风险,要…...
