背景 任意文件读取是 Java Web 项目里比较常见、但经常被低估的一类漏洞。它不像命令执行那样直观,也不一定能直接拿到权限,但在真实环境中,如果能读取配置文件、日志、密钥、源码或运行时信息,后续风险会被迅速放大。 这篇文章整理一次代码审计中的典型定位过程,重点放在漏洞成因、审计思路、复现边界和修复方式。内容只讨论授权测试和自查场景,不涉及未授权目标的攻击利用。 问题场景 某 Java Web 系统提供了文件预览和下载功能,接口大致用于读取服务器上的附件文件。业务侧最初的设计是:前端传入文件路径或文件名,后端读取对应文件并返回给浏览器。 常见接口形态类似下面几种: GET /file/download?path=/upload/2024/report.pdf
GET /preview?fileName=report.pdf
POST /api/file/read {"file":"/upload/demo.txt"}如果后端直接信任用户输入,并把参数拼接到本地文件路径中,就容易出现目录穿越和任意文件读取问题。 漏洞成因分析 审计时看到的风险代码通常有几个明显特征: 用户可控参数参与文
背景文件上传是 Web 系统里很常见的功能,头像、附件、合同、工单图片、导入模板都会涉及。它的问题在于看起来业务简单,实际跨了权限、存储、解析、访问控制、内容安全等多个边界。很多漏洞并不是单点过滤缺失,而是多个细节叠加后形成风险。这篇文章整理一次代码审计中比较典型的文件上传风险分析方法,重点放在如何从代码层面识别问题、如何做安全验证,以及如何给出可落地的修复建议。内容只讨论授权测试和防护思路,不涉及非法利用。问题场景审计目标是一个 Java Web 系统,后端使用 Spring MVC,上传文件通过统一接口处理。业务侧声称已经做了白名单校验,上传目录也不在 Web 根目录下。但在审计过程中发现,部分接口复用了上传服务,却传入了不同的参数,导致实际防护并不一致。简化后的调用关系大致如下:Controller
-> UploadService.upload(file, bizType, userId)
-> FileNameUtil.normalize(originalName)
-> FileTypeValidator.check(fi