JavaEE文件泄露与修复方案
在JavaEE应用中,文件泄露漏洞通常由路径遍历、不安全文件访问或配置缺陷引发。以下是常见原因、风险及修复方案:
常见泄露原因
路径遍历攻击
java
// 漏洞示例:用户可构造参数获取任意文件 String filePath = request.getParameter("file"); File file = new File("/baseDir/" + filePath); // 攻击者输入"../../../etc/passwd"静态资源目录暴露敏感文件
将
WEB-INF或META-INF目录映射为静态资源。
错误信息泄露
异常堆栈暴露服务器路径(如
FileNotFoundException显示完整路径)。
未授权文件下载
下载接口未校验用户权限或文件名合法性。
修复方案
1. 路径遍历防护
java
// 安全写法:规范路径并校验是否在允许目录内
String userInput = request.getParameter("file");
Path baseDir = Paths.get("/safe/baseDir").toAbsolutePath().normalize();
Path resolvedPath = baseDir.resolve(userInput).normalize();if (!resolvedPath.startsWith(baseDir)) {throw new SecurityException("非法路径访问");
}
File file = resolvedPath.toFile();2. 禁用敏感目录访问
web.xml 配置:禁止访问
WEB-INF和META-INFxml
<security-constraint><web-resource-collection><url-pattern>/WEB-INF/*</url-pattern><url-pattern>/META-INF/*</url-pattern></web-resource-collection><auth-constraint /> </security-constraint>
3. 文件下载安全控制
白名单校验文件名:
java
if (!fileName.matches("[a-zA-Z0-9_\\-]+\\.(jpg|pdf)")) {response.sendError(400, "非法文件名");return; }权限校验:
java
if (!user.hasPermission(fileName)) {response.sendError(403, "无访问权限"); }
4. 错误信息处理
全局异常处理器屏蔽敏感信息:
java
@WebServlet("/error-handler") public class ErrorHandler extends HttpServlet {protected void doGet(HttpServletRequest req, HttpServletResponse resp) {Throwable ex = (Throwable) req.getAttribute("javax.servlet.error.exception");resp.sendRedirect("/generic-error.html"); // 跳转到通用错误页} }在
web.xml中配置:xml
<error-page><exception-type>java.lang.Throwable</exception-type><location>/error-handler</location> </error-page>
5. 服务器加固
文件存储隔离:将用户上传文件存储到独立目录(如
/data/uploads),禁止放在Web应用目录内。最小权限原则:运行容器的系统用户仅授予必要目录的读/写权限。
安全扫描:使用工具(如 OWASP ZAP、Fortify)定期扫描路径遍历漏洞。
6. 安全编码规范
避免直接拼接用户输入的文件路径,使用
Path.normalize()消除../。对下载文件名进行RFC 5987编码,防止XSS:
java
String safeFileName = "filename=\"" + fileName.replace("\"", "") + "\""; String encodedFileName = "filename*=UTF-8''" + URLEncoder.encode(fileName, "UTF-8"); response.setHeader("Content-Disposition", "attachment; " + safeFileName + "; " + encodedFileName);
防御多层架构
| 层级 | 防护措施 |
|---|---|
| 前端 | 文件名白名单校验(JS二次验证) |
| 网关 | WAF拦截 ../、%2e%2e/ 等攻击 |
| 应用层 | 路径规范化+目录权限校验 |
| 存储层 | 文件独立存储+最小权限 |
| 容器 | 配置安全约束(web.xml) |
测试验证
尝试访问
http://host/download?file=../../WEB-INF/web.xml。使用工具检测目录遍历(如 Burp Suite Intruder)。
检查错误页面是否暴露路径信息。
通过以上措施,可显著降低JavaEE应用文件泄露风险。核心原则:永不信任用户输入,强制路径校验,最小化权限暴露。
