攻防项目中的代码审计
字数 1873 2025-08-29 22:41:24

攻防项目中的代码审计实战案例教学

1. 某图书馆管理系统文件上传漏洞分析

1.1 漏洞发现背景

  • 目标系统:某市图书馆管理系统
  • 部署方式:Tomcat部署
  • 初始发现:存在权限绕过漏洞可进入后台但无法直接利用

1.2 漏洞分析流程

1.2.1 上传接口定位

  • 通过web.xml搜索"upload"定位上传接口
  • 确认前台接口方法:
    • 直接访问返回302跳转的是后台接口
    • 查看引入类,包含session相关的是后台接口
  • 确认/loan/PictureUpload为前台无权限校验的上传接口

1.2.2 上传流程分析

  1. 获取web目录下的tmp路径

  2. 调用b.a()方法处理请求:

    • 设置tmp路径到f.b
    • 调用com.oreilly.servlet.MultipartRequest处理请求体
    • 参数:tmp路径、500*1024(文件大小限制)
  3. MultipartRequest处理流程:

    • 检查请求体和文件目录非空
    • 使用MultipartParser()解析POST请求体
    • 调用readNextPart()处理各部分内容
  4. 文件部分处理:

    • 提取Content-Disposition信息
    • 获取filename值(原始上传文件名)
    • 实例化FilePart设置fileName和filePath
  5. 写入文件:

    • 最终写入路径为tmp路径+filename
    • 但实际访问发现文件不在预期位置

1.2.3 关键绕过点

  • 文件名处理流程:

    • b.c()方法处理上传文件参数
    • 调用b(filename,name)方法:
      • 判断filename是否包含图片后缀(jpg/png等)
      • 生成最终文件名:name + b.b(filename)
  • b.b(filename)方法:

    • 检查是否以jsp结尾,是则替换为txt
    • 返回filename中第一个"."之后的内容作为后缀
    • 可利用1.png.jspx绕过后缀检查
  • 最终文件处理:

    • 原始文件写入tmp/原始文件名
    • 复制到tmp/name.处理后后缀
    • 删除原始文件

1.3 漏洞利用

  • 构造上传包:
    • 使用目录穿越控制写入路径
    • 使用1.png.jspx绕过后缀检查
    • 控制name参数决定最终文件名

2. 某广播系统任意文件上传漏洞分析

2.1 系统特点

  • 部署结构:
    • web目录:Tomcat部署文件
    • server目录:包含jar文件运行独立服务
    • mysql目录:SQL日志

2.2 漏洞发现

  • 发现独立服务端口运行额外接口
  • saveFile接口存在任意文件上传:
    • 参数:
      • fileStr:Base64编码的文件内容
      • fileName:文件名
      • deviceCode:必须为系统存在的设备码
      • 文件路径参数

2.3 利用条件

  1. 获取有效deviceCode:

    • 通过list接口查询
    • 对应mapper只需roleId即可查询count(*)
  2. 路径限制:

    • 代码写死路径在E盘下
    • 通过SQL注入报错获取web路径
    • 确认系统部署在E盘可目录穿越

2.4 利用方法

  1. 通过list接口获取有效deviceCode
  2. 构造上传包:
    • fileStr使用Base64编码
    • 控制fileName为jsp文件
    • 使用目录穿越写入web目录

3. 某协同办公系统文件上传漏洞分析

3.1 漏洞特点

  • 使用org.apache.commons.fileupload.servlet.ServletFileUpload处理上传
  • 特殊要求:filename必须包含"@"

3.2 上传处理逻辑

  • 对filename按"@"分割为两部分:
    • 第一部分与上传目录拼接形成新目录
    • 第二部分与新目录拼接形成最终文件路径
  • 默认上传目录:cms/html

3.3 利用方法

  • 构造filename为@1.jsp
    • 第一部分为空,使用默认目录
    • 第二部分为1.jsp,写入默认目录下

通用代码审计技巧总结

  1. 上传接口定位

    • 从web.xml搜索"upload"相关配置
    • 区分前后台接口:302跳转或session检查
  2. 上传流程分析

    • 关注文件名校验逻辑
    • 注意路径拼接方式
    • 检查是否有重命名策略
  3. 第三方组件使用

    • 常见上传组件如commons-fileupload可不必深入分析
    • 重点关注自定义处理逻辑
  4. 多角度突破

    • web目录无果时可检查独立服务
    • 注意部署包中的非标准目录结构
  5. 信息收集辅助

    • 利用其他漏洞(如SQL注入)获取路径信息
    • 通过其他接口获取必要参数
  6. 绕过技巧

    • 后缀检查绕过(如双后缀)
    • 目录穿越控制写入位置
    • 参数控制最终文件名
攻防项目中的代码审计实战案例教学 1. 某图书馆管理系统文件上传漏洞分析 1.1 漏洞发现背景 目标系统:某市图书馆管理系统 部署方式:Tomcat部署 初始发现:存在权限绕过漏洞可进入后台但无法直接利用 1.2 漏洞分析流程 1.2.1 上传接口定位 通过web.xml搜索"upload"定位上传接口 确认前台接口方法: 直接访问返回302跳转的是后台接口 查看引入类,包含session相关的是后台接口 确认 /loan/PictureUpload 为前台无权限校验的上传接口 1.2.2 上传流程分析 获取web目录下的tmp路径 调用 b.a() 方法处理请求: 设置tmp路径到 f.b 调用 com.oreilly.servlet.MultipartRequest 处理请求体 参数:tmp路径、500* 1024(文件大小限制) MultipartRequest 处理流程: 检查请求体和文件目录非空 使用 MultipartParser() 解析POST请求体 调用 readNextPart() 处理各部分内容 文件部分处理: 提取Content-Disposition信息 获取filename值(原始上传文件名) 实例化 FilePart 设置fileName和filePath 写入文件: 最终写入路径为 tmp路径+filename 但实际访问发现文件不在预期位置 1.2.3 关键绕过点 文件名处理流程: b.c() 方法处理上传文件参数 调用 b(filename,name) 方法: 判断filename是否包含图片后缀(jpg/png等) 生成最终文件名: name + b.b(filename) b.b(filename) 方法: 检查是否以jsp结尾,是则替换为txt 返回filename中第一个"."之后的内容作为后缀 可利用 1.png.jspx 绕过后缀检查 最终文件处理: 原始文件写入 tmp/原始文件名 复制到 tmp/name.处理后后缀 删除原始文件 1.3 漏洞利用 构造上传包: 使用目录穿越控制写入路径 使用 1.png.jspx 绕过后缀检查 控制name参数决定最终文件名 2. 某广播系统任意文件上传漏洞分析 2.1 系统特点 部署结构: web目录:Tomcat部署文件 server目录:包含jar文件运行独立服务 mysql目录:SQL日志 2.2 漏洞发现 发现独立服务端口运行额外接口 saveFile 接口存在任意文件上传: 参数: fileStr:Base64编码的文件内容 fileName:文件名 deviceCode:必须为系统存在的设备码 文件路径参数 2.3 利用条件 获取有效deviceCode: 通过 list 接口查询 对应mapper只需roleId即可查询count(* ) 路径限制: 代码写死路径在E盘下 通过SQL注入报错获取web路径 确认系统部署在E盘可目录穿越 2.4 利用方法 通过list接口获取有效deviceCode 构造上传包: fileStr使用Base64编码 控制fileName为jsp文件 使用目录穿越写入web目录 3. 某协同办公系统文件上传漏洞分析 3.1 漏洞特点 使用 org.apache.commons.fileupload.servlet.ServletFileUpload 处理上传 特殊要求:filename必须包含"@" 3.2 上传处理逻辑 对filename按"@"分割为两部分: 第一部分与上传目录拼接形成新目录 第二部分与新目录拼接形成最终文件路径 默认上传目录:cms/html 3.3 利用方法 构造filename为 @1.jsp : 第一部分为空,使用默认目录 第二部分为1.jsp,写入默认目录下 通用代码审计技巧总结 上传接口定位 : 从web.xml搜索"upload"相关配置 区分前后台接口:302跳转或session检查 上传流程分析 : 关注文件名校验逻辑 注意路径拼接方式 检查是否有重命名策略 第三方组件使用 : 常见上传组件如commons-fileupload可不必深入分析 重点关注自定义处理逻辑 多角度突破 : web目录无果时可检查独立服务 注意部署包中的非标准目录结构 信息收集辅助 : 利用其他漏洞(如SQL注入)获取路径信息 通过其他接口获取必要参数 绕过技巧 : 后缀检查绕过(如双后缀) 目录穿越控制写入位置 参数控制最终文件名