记录一次java项目的审计
字数 1732 2025-08-29 08:29:36

Java项目安全审计实战教学文档

1. 漏洞概述

本次审计发现了一个Java Web项目中的多个严重安全漏洞,包括:

  • 远程代码执行(RCE)
  • 服务器端请求伪造(SSRF)
  • 跨站脚本攻击(XSS)
  • 任意文件删除
  • 任意文件读取
  • SQL注入

2. 远程代码执行(RCE)漏洞分析

2.1 漏洞位置

  • 控制器:SEO控制器
  • 方法:save方式

2.2 漏洞利用链

  1. 通过param方法传参
  2. 进入_set方法
  3. Filename参数为"seo",文件路径可预测
  4. 将param参数for循环处理
  5. 使用file_put_contents写入文件

2.3 漏洞成因

  • 整个文件写入过程无任何过滤
  • 文件路径可预测
  • 导致任意文件上传,最终实现RCE

2.4 复现步骤

  1. 找到SEO控制器的save方法
  2. 通过param方法传入恶意参数
  3. 参数会被_set方法处理
  4. 系统将写入可预测路径的文件
  5. 通过访问写入的恶意文件实现代码执行

3. 服务器端请求伪造(SSRF)漏洞

3.1 漏洞位置

  • 方法:getimg方式
  • 函数:download函数

3.2 漏洞利用链

  1. url参数可控
  2. 进入download函数
  3. 文件路径由上传日期和访问url的文件昵称组成(可预测)
  4. 传入远程恶意文件URL
  5. get_url_content函数获取URL内容(无过滤)
  6. 内容被写入服务器,实现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 漏洞详情

  1. 通过id参数传递要删除的文件路径
  2. 路径直接拼接,无过滤
  3. 实现任意文件删除
  4. 还存在任意目录删除功能,可删除整个目录下的文件

5.3 漏洞成因

  • 直接使用用户输入拼接文件路径
  • 无任何路径校验或过滤
  • 使用过高权限执行删除操作

6. 任意文件读取漏洞

6.1 漏洞详情

  • 数据包报错信息中包含文件读取的内容
  • 通过构造特定请求可读取服务器任意文件

6.2 漏洞成因

  • 错误信息泄露敏感数据
  • 未对文件读取功能进行权限控制
  • 未过滤特殊路径字符(如../)

7. SQL注入漏洞

7.1 漏洞详情

  • 未明确说明具体位置
  • 但存在SQL注入漏洞

7.2 可能成因

  • 直接拼接用户输入到SQL语句
  • 未使用参数化查询
  • 未实施输入过滤

8. 修复建议

8.1 通用修复原则

  1. 实施最小权限原则
  2. 所有用户输入视为不可信
  3. 实施深度防御策略

8.2 具体修复措施

RCE修复:

  • 限制文件上传类型
  • 对上传内容进行严格校验
  • 使用不可预测的文件名
  • 设置上传目录无执行权限

SSRF修复:

  • 禁止从外部URL获取文件
  • 如需必要,建立白名单域名机制
  • 禁用危险协议(file://, ftp://等)

XSS修复:

  • 禁止上传SVG等可执行HTML的文件
  • 或对上传的SVG进行严格净化
  • 实施CSP策略

文件删除/读取修复:

  • 实施严格的路径校验
  • 使用白名单允许的文件/目录
  • 对用户输入进行规范化处理

SQL注入修复:

  • 使用参数化查询
  • 使用ORM框架
  • 实施输入验证

9. 审计方法论

  1. 入口点分析:

    • 控制器方法
    • 参数传递方式
    • 文件上传功能
  2. 数据流追踪:

    • 从用户输入到敏感操作
    • 关注无过滤的数据流
  3. 敏感函数识别:

    • file_put_contents
    • 文件删除函数
    • 数据库查询函数
    • 文件读取函数
  4. 权限校验检查:

    • 操作前是否有权限验证
    • 是否实施CSRF防护
  5. 错误处理分析:

    • 错误信息是否泄露敏感数据
    • 是否暴露系统内部信息

10. 总结

本次审计展示了Java Web项目中常见的安全问题,强调了输入验证、输出编码、最小权限等安全原则的重要性。安全审计应从用户可控的输入点出发,追踪数据流向,特别关注无过滤直接使用用户输入的场景。

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项目中常见的安全问题,强调了输入验证、输出编码、最小权限等安全原则的重要性。安全审计应从用户可控的输入点出发,追踪数据流向,特别关注无过滤直接使用用户输入的场景。