DVWN(Damn Vulnerable Web Application)的Java版本是近年来安全圈内广泛使用的漏洞靶场系统。这个靶场专门模拟了企业级Java Web应用中常见的安全漏洞场景,其中信息泄露类漏洞因其隐蔽性和高危害性,成为渗透测试中的重点审计对象。
我在去年参与某金融系统红队评估时,就曾遇到过一个典型的目录遍历漏洞。攻击者通过精心构造的URL参数,竟然能直接下载到服务器上的数据库备份文件。这种案例让我深刻意识到,信息泄露漏洞往往比SQL注入等传统漏洞更具破坏性——因为它们经常被开发人员忽视,却能为攻击者提供最直接的敏感数据。
在审计某电商平台时,我发现其文件下载接口存在这样的代码:
java复制@GetMapping("/download")
public void downloadFile(@RequestParam String filename,
HttpServletResponse response) {
File file = new File("/var/www/uploads/" + filename);
Files.copy(file.toPath(), response.getOutputStream());
}
这段代码的致命缺陷在于直接拼接用户输入的filename参数。攻击者通过构造../../etc/passwd这样的路径,就能读取系统敏感文件。更可怕的是,当应用部署在Windows服务器时,利用..\的路径分隔符同样有效。
防护方案:
Path.normalize()规范化路径某OA系统的登录接口曾返回这样的错误响应:
json复制{
"error": "SQLException: SELECT * FROM users WHERE username='admin' AND password='xxx'",
"stacktrace": ["com.mysql.jdbc.DatabaseMetaData.getColumns()",...]
}
这种详细的错误信息直接暴露了SQL语句结构和数据库类型。我在审计时发现,开发者在测试环境开启了Spring Boot的server.error.include-stacktrace=always配置,却忘记在生产环境关闭。
修复要点:
server.error.include-stacktrace=never我推荐使用以下工具组合进行自动化审计:
| 工具名称 | 检测能力 | 集成方式 |
|---|---|---|
| SpotBugs | 基础API误用检测 | Maven/Gradle插件 |
| SonarQube | 安全规则库覆盖全面 | CI/CD流水线 |
| Semgrep | 自定义规则匹配敏感模式 | 命令行扫描 |
特别分享一个Semgrep规则示例,用于检测未过滤的路径拼接:
yaml复制rules:
- id: path-traversal
pattern: new File($BASE + $USERINPUT)
message: "Potential path traversal vulnerability"
使用Burp Suite进行信息泄露测试时,我总结出这些关键点:
修改HTTP头测试:
X-Forwarded-For等伪头部特殊文件探测:
code复制GET /WEB-INF/web.xml
GET /phpinfo.php
GET /.git/config
响应差异分析:
我在金融行业项目中采用的防御模型:
code复制客户端防护 → 网络层过滤 → 应用层校验 → 数据层隔离
↓ ↓
WAF规则 日志监控告警
对于文件下载功能,我建议采用这种安全写法:
java复制public ResponseEntity<Resource> download(@PathVariable String fileId) {
// 1. 校验文件ID格式
if(!fileId.matches("[a-zA-Z0-9]{32}")) {
throw new InvalidParameterException();
}
// 2. 数据库查询真实路径
FileRecord record = fileRepository.findById(fileId);
Path safePath = Paths.get("/secure/storage", record.getHashedName());
// 3. 设置安全响应头
return ResponseEntity.ok()
.header("Content-Disposition", "attachment; filename=\""+record.getOriginalName()+"\"")
.header("X-Content-Type-Options", "nosniff")
.body(new FileSystemResource(safePath));
}
去年在某次授权测试中,我发现目标系统存在接口未授权访问漏洞。通过以下步骤完成了利用:
X-Powered-By: JFramework/1.3/admin-apicode复制/admin-api/users
/admin-api/config
/admin-api/db-backup
/admin-api/db-backup获取到SQL备份这个案例的教训是:框架的默认配置和组件往往成为突破口。建议在投产前:
根据OWASP ASVS标准,我整理出Java项目必须实现的检查项:
错误处理:
文件操作:
敏感信息:
在代码审查时,我特别关注这些高危模式:
System.out.println(e)new File(userInput)@RequestMapping("/admin")无权限校验当发现信息泄露事件时,建议立即执行:
取证阶段:
处置阶段:
bash复制# 紧急禁用相关接口
iptables -A INPUT -p tcp --dport 8080 -j DROP
# 重置可能泄露的凭证
for user in $(cat /etc/passwd); do passwd -e $user; done
复盘改进:
对于更隐蔽的泄露漏洞,我常用这些高级技巧:
时间盲注检测:
java复制if(condition) {
Thread.sleep(3000); // 响应延迟判断
}
内存残留检测:
bash复制strings heap.bin | grep "password"
缓存投毒:
在最近一次审计中,通过分析GC日志发现系统在异常处理时,敏感对象未能及时回收,导致内存中残留认证信息。这提醒我们:安全编码需要关注对象生命周期管理。