当前位置: 首页 > news >正文

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&#xff0c;主要参考 OWASP TOP 10 2017RC2&#xff0c;此版本中增加了 XXE 攻击&#xff0c;所以自己简单的研究下 XXE 攻击。XXE&#xff08;XML External Entity&#xff09;XML 外部实体&#xff0c;当前端和后端通信数据采用 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.设备&#xff1a;Cyclone II EP2C8Q208C8N 3.实验&#xff1a;正点原子-verilog基础知识 4.时序图&#xff1a; 5.步骤 6.代码&#xff1a;...

LockBit病毒入侵揭秘:如何防范与应对

在数字时代&#xff0c;随着科技的飞速发展&#xff0c;网络安全问题愈发凸显。恶意软件和勒索软件等网络威胁正不断演变&#xff0c;其中一款备受关注的勒索软件就是LockBit。本文将深入介绍LockBit的特征、攻击手段、演进历程以及对网络安全的威胁。 01 主要特征 LockBit是…...

vue-router4 (六) 路由嵌套

应用场景&#xff1a; ①比如京东页面的首页、购物车、我的按钮&#xff0c;可以点击切换到对应的页面&#xff1b; ② 比如 Ant Design左侧这些按钮点击就会切到对应的页面&#xff0c;此时可以把左侧按钮放在父路由中&#xff0c;右侧的子路由 1.路由配置&#xff0c;子路由…...

【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 针对上述不同用例&#xff0c;3GPP考虑按…...

【AI绘画】免费GPU Tesla A100 32G算力部署Stable Diffusion

免责声明 在阅读和实践本文提供的内容之前&#xff0c;请注意以下免责声明&#xff1a; 侵权问题: 本文提供的信息仅供学习参考&#xff0c;不用做任何商业用途&#xff0c;如造成侵权&#xff0c;请私信我&#xff0c;我会立即删除&#xff0c;作者不对读者因使用本文所述方法…...

JVM(2)

JVM类加载 指的是java进程运行时,需要把.class文件从硬盘加载到内存,并进行一系列校验解析的过程. 核心: .class文件>类对象; 硬盘>内存. 类加载过程 在整个JVM的执行流程中,和程序员关系最密切的就是类加载的过程了,所以我们来看一下类加载的执行流程. 对于一个类…...

青少年CTF擂台挑战赛 2024 #Round 1 Web方向题解 WP 全

EasyMD5 题目描述&#xff1a;php没有难题 考点总结&#xff1a;脑洞题目&#xff0c;不如我出&#xff08;狗头 只允许两个都上传pdf文件。 文件还不能太大了。burp多次发包发现要求两个pdf内容不一样 不一样时候&#xff0c;提示我们MD5碰撞。 科学计数法绕过 PHP的后门 …...

一文认识蓝牙(验证基于Aduino IDE的ESP32)

1、简介 蓝牙技术是一种无线通信的方式&#xff0c;利用特定频率的波段&#xff08;2.4GHz-2.485GHz左右&#xff09;&#xff0c;进行电磁波传输&#xff0c;总共有83.5MHz的带宽资源。 1.1、背景 蓝牙&#xff08;Bluetooth&#xff09;一词取自于十世纪丹麦国王哈拉尔Haral…...

2W字-35页PDF谈谈自己对QT某些知识点的理解

2W字-35页PDF谈谈自己对QT某些知识点的理解 前言与总结总体知识点的概况一些笔记的概况笔记阅读清单 前言与总结 最近&#xff0c;也在对自己以前做的项目做一个知识点的梳理&#xff0c;发现可能自己以前更多的是用某个控件&#xff0c;以及看官方手册&#xff0c;但是没有更…...

Docker知识点总结

二、Docker基本命令&#xff1a; Docker支持CentOs 6 及以后的版本; CentOs7系统可以直接通过yum进行安装&#xff0c;安装前可以 1、查看一下系统是否已经安装了Docker: yum list installed | grep docker 2、安装docker&#xff1a; yum install docker -y -y 表示自动确认…...

Redis 消息队列:构建消息代理的 4 个简单步骤

消息代理是一种使系统、应用程序和服务能够通信和交换信息的软件。它在正式消息传递协议之间转换消息,并允许相互依赖的服务直接“对话”,即使是用不同语言编写或在不同平台上实现也是如此。在微服务中使用异步通信时,通常会使用消息代理。 消息代理可确保可靠且稳定的通信,…...

kafka三节点集群平滑升级过程指导

一、前言 Apache Kafka作为常用的开源分布式流媒体平台&#xff0c;可以实时发布、订阅、存储和处理数据流,多用于作为消息队列获取实时数据&#xff0c;构建对数据流的变化进行实时反应的应用程序&#xff0c;已被数千家公司用于高性能数据管道、流分析、数据集成和任务关键型…...

Golang 简介与基本语法学习

Go&#xff0c;也被称为 Golang&#xff0c;是一门由 Google 设计的开源编程语言。它旨在提供高效的开发体验&#xff0c;同时具备并发性、内存安全和简洁性。本篇博客将介绍 Golang 的基本语法和一些示例&#xff0c;帮助读者快速入门这门令人着迷的语言。 简介 Go 语言的设…...

深入理解网络通信基本原理和tcp/ip协议

深入理解网络通信基本原理和tcp/ip协议 一、计算机网络体系1&#xff0c;计算机网络体系结构2&#xff0c;网络中数据传输2.1&#xff0c;浏览器中输入一个url的执行流程2.2&#xff0c;数据在网络中是的传输流程 3&#xff0c;三次握手和四次挥手3.1&#xff0c;三次握手3.1.1…...

Jetson系统烧录环境搭建

一 序言 Jetson 系列产品烧录系统的方法一般有两种&#xff0c;一种为使用 NVIDIA 官方提供 的 SDK manager 软件给 Jetson 设备烧录系统&#xff08;请查看说明文档《Jetson 产品使用 SDKmanager 烧录系统》&#xff09;。另一种即为当前文档所描述的&#xff0c;在安装 Ubun…...

【MySQL】:约束全解析

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; MySQL从入门到进阶 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一. 约束概述二. 约束演示三. 外键约束3.1 介绍3.2 语法3.3 删除/更新行为 &…...

设计一基于Text generation web UI的语言模型部署与远程访问的方案​

前言 Text generation web UI可为类ChatGPT的大型语言模型提供能够快速上手的网页界面&#xff0c;不仅可以提高使用效率&#xff0c;还可满足私有化部署&#xff0c;或对模型进行自定义。目前&#xff0c;该Web UI已经支持了许多流行的语言模型&#xff0c;包括LLaMA、llama.…...

大数据概述

学习大数据有什么用&#xff1f; 2010年&#xff1a;大数据技术体系开始在国内火热 2015年&#xff1a;国务院印发《促进大数据发展行动纲要》 2016年&#xff1a;发改委发布关于组织实施促进大数据发展重大工程的通知 2017年&#xff1a;工信部印发大数据产业规划(2016-20…...

汽车故障诊断仿真教学软件【哈弗M6PLUS】:技术架构、功能实现与落地实践

在职业教育汽车专业数字化实训转型进程中&#xff0c;长城哈弗M6PLUS作为院校主流实训车型&#xff0c;其故障诊断教学长期面临诸多落地难题&#xff1a;实车故障设置繁琐、损耗率高&#xff0c;抽象的诊断流程难以可视化&#xff1b;传统仿真软件普遍存在车型对标度不足、故障…...

Omni-Vision Sanctuary 长短期记忆网络应用:时间序列预测与文本生成

Omni-Vision Sanctuary 长短期记忆网络应用&#xff1a;时间序列预测与文本生成 1. 序列数据处理的挑战与机遇 在当今数据驱动的世界中&#xff0c;序列数据无处不在——从股票市场的价格波动到人类语言的文字排列&#xff0c;再到视频中的连续帧。这些数据都有一个共同特点&…...

值类型与引用类型:别再只背“栈和堆”了,看这 个实际影响颜

基础示例&#xff1a;单工作表 Excel 转 TXT 以下是将一个 Excel 文件中的第一个工作表转换为 TXT 的完整步骤&#xff1a; 1. 加载并读取Excel文件 from spire.xls import * from spire.xls.common import * workbook Workbook() workbook.LoadFromFile("示例.xlsx"…...

OpenClaw模型热切换:Qwen3-14b_int4_awq与ChatGLM3动态路由实验

OpenClaw模型热切换&#xff1a;Qwen3-14b_int4_awq与ChatGLM3动态路由实验 1. 为什么需要模型热切换 上周我在处理一个自动化任务时遇到了典型困境&#xff1a;让OpenClaw帮我生成Python爬虫代码时&#xff0c;ChatGLM3给出的方案总是过于保守&#xff1b;而让它写产品文案时…...

OpenClaw替代方案:当Kimi-VL-A3B-Thinking不可用时的应急处理

OpenClaw替代方案&#xff1a;当Kimi-VL-A3B-Thinking不可用时的应急处理 1. 为什么需要制定模型故障应对策略 上周五凌晨3点&#xff0c;我被一阵急促的报警声惊醒。手机屏幕上闪烁着OpenClaw的异常通知——我部署的Kimi-VL-A3B-Thinking模型服务突然不可用。这个模型负责处…...

零基础玩转GLM-OCR:单卡4090一键部署,纯文本/公式/表格全能解析

零基础玩转GLM-OCR&#xff1a;单卡4090一键部署&#xff0c;纯文本/公式/表格全能解析 1. 工具概览&#xff1a;你的全能文档解析助手 想象一下&#xff0c;你手头有一堆扫描的PDF、照片或截图&#xff0c;里面有重要文字、复杂公式和结构化表格。传统OCR工具要么识别不准&a…...

2026年智能码牌服务商,究竟合不合法合规?

在数字支付行业蓬勃发展的今天&#xff0c;智能码牌服务商逐渐成为市场的焦点。随着2026年的到来&#xff0c;人们对于这些服务商的合法合规性愈发关注。以财联支付为例&#xff0c;我们来深入探讨智能码牌服务商的合法合规性问题。一、合法合规的基础&#xff1a;技术与资质双…...

Android Jetpack Compose - 修饰符顺序的影响、Divider(分隔线)、DropdownMenu(下拉菜单)、NavigationBar(导航栏)

一、修饰符顺序的影响 红色背景区域&#xff1a;200 - 50 * 2 100 * 100 dp&#xff0c;点击区域&#xff1a;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封装&#xff1a;将SecGPT-14B能力集成到现有安全工具链 1. 为什么需要API封装 去年我在构建自动化安全审计系统时&#xff0c;发现很多团队面临一个共同困境&#xff1a;虽然本地部署了大模型&#xff0c;但模型能力始终无法真正融入现有工作流。SecGPT-14B作为…...

OpenClaw+Qwen3.5-9B组合优势:3个不可替代的使用场景

OpenClawQwen3.5-9B组合优势&#xff1a;3个不可替代的使用场景 1. 为什么选择OpenClawQwen3.5-9B组合 去年夏天&#xff0c;当我第一次尝试用Python脚本自动化处理医疗研究数据时&#xff0c;遇到了一个尴尬的问题&#xff1a;要么忍受公有云API的数据隐私风险&#xff0c;要…...