记录一次java项目的审计
字数 1732 2025-08-29 08:29:36
Java项目安全审计实战教学文档
1. 漏洞概述
本次审计发现了一个Java Web项目中的多个严重安全漏洞,包括:
- 远程代码执行(RCE)
- 服务器端请求伪造(SSRF)
- 跨站脚本攻击(XSS)
- 任意文件删除
- 任意文件读取
- SQL注入
2. 远程代码执行(RCE)漏洞分析
2.1 漏洞位置
- 控制器:SEO控制器
- 方法:save方式
2.2 漏洞利用链
- 通过param方法传参
- 进入_set方法
- Filename参数为"seo",文件路径可预测
- 将param参数for循环处理
- 使用file_put_contents写入文件
2.3 漏洞成因
- 整个文件写入过程无任何过滤
- 文件路径可预测
- 导致任意文件上传,最终实现RCE
2.4 复现步骤
- 找到SEO控制器的save方法
- 通过param方法传入恶意参数
- 参数会被_set方法处理
- 系统将写入可预测路径的文件
- 通过访问写入的恶意文件实现代码执行
3. 服务器端请求伪造(SSRF)漏洞
3.1 漏洞位置
- 方法:getimg方式
- 函数:download函数
3.2 漏洞利用链
- url参数可控
- 进入download函数
- 文件路径由上传日期和访问url的文件昵称组成(可预测)
- 传入远程恶意文件URL
- get_url_content函数获取URL内容(无过滤)
- 内容被写入服务器,实现getshell
3.3 漏洞成因
- get_url_content函数对传入URL无任何过滤
- 文件路径可预测
- 允许从任意URL获取内容并写入服务器
4. 跨站脚本攻击(XSS)漏洞
4.1 漏洞位置
- 文件上传功能
4.2 漏洞详情
- 系统允许上传SVG文件
- SVG文件可包含恶意JavaScript代码
- 数据包回显文件路径
- 当SVG文件被访问时,恶意代码执行
4.3 漏洞成因
- 未对上传的SVG文件内容进行过滤
- 未设置正确的Content-Type头
- 未实施CSP(内容安全策略)
5. 任意文件删除漏洞
5.1 漏洞位置
- 通过id参数传参
5.2 漏洞详情
- 通过id参数传递要删除的文件路径
- 路径直接拼接,无过滤
- 实现任意文件删除
- 还存在任意目录删除功能,可删除整个目录下的文件
5.3 漏洞成因
- 直接使用用户输入拼接文件路径
- 无任何路径校验或过滤
- 使用过高权限执行删除操作
6. 任意文件读取漏洞
6.1 漏洞详情
- 数据包报错信息中包含文件读取的内容
- 通过构造特定请求可读取服务器任意文件
6.2 漏洞成因
- 错误信息泄露敏感数据
- 未对文件读取功能进行权限控制
- 未过滤特殊路径字符(如../)
7. SQL注入漏洞
7.1 漏洞详情
- 未明确说明具体位置
- 但存在SQL注入漏洞
7.2 可能成因
- 直接拼接用户输入到SQL语句
- 未使用参数化查询
- 未实施输入过滤
8. 修复建议
8.1 通用修复原则
- 实施最小权限原则
- 所有用户输入视为不可信
- 实施深度防御策略
8.2 具体修复措施
RCE修复:
- 限制文件上传类型
- 对上传内容进行严格校验
- 使用不可预测的文件名
- 设置上传目录无执行权限
SSRF修复:
- 禁止从外部URL获取文件
- 如需必要,建立白名单域名机制
- 禁用危险协议(file://, ftp://等)
XSS修复:
- 禁止上传SVG等可执行HTML的文件
- 或对上传的SVG进行严格净化
- 实施CSP策略
文件删除/读取修复:
- 实施严格的路径校验
- 使用白名单允许的文件/目录
- 对用户输入进行规范化处理
SQL注入修复:
- 使用参数化查询
- 使用ORM框架
- 实施输入验证
9. 审计方法论
-
入口点分析:
- 控制器方法
- 参数传递方式
- 文件上传功能
-
数据流追踪:
- 从用户输入到敏感操作
- 关注无过滤的数据流
-
敏感函数识别:
- file_put_contents
- 文件删除函数
- 数据库查询函数
- 文件读取函数
-
权限校验检查:
- 操作前是否有权限验证
- 是否实施CSRF防护
-
错误处理分析:
- 错误信息是否泄露敏感数据
- 是否暴露系统内部信息
10. 总结
本次审计展示了Java Web项目中常见的安全问题,强调了输入验证、输出编码、最小权限等安全原则的重要性。安全审计应从用户可控的输入点出发,追踪数据流向,特别关注无过滤直接使用用户输入的场景。