某次大学的渗透测试经历
字数 1277 2025-08-22 12:23:06

大学渗透测试实战:从源码泄露到Shiro反序列化漏洞利用

1. 信息收集阶段

1.1 初始发现

  • 目标URL:http://xxx.xxx.edu.cn/trp/file/desc?fileId=438
  • 发现该接口返回文件下载地址(内网地址)
  • 通过相似路由测试确认可访问性

1.2 文件泄露测试

  • 对fileId参数进行爆破(000-999)
  • 搜索响应中包含.zip.rar的结果
  • 成功获取源码压缩包(war格式)

2. 源码审计流程

2.1 工具准备

  • JD-GUI:用于反编译Java字节码
  • VS Code:用于代码搜索和分析
  • 反编译技巧:Ctrl+Alt+S保存所有反编译源码

2.2 技术栈分析

  • 框架识别:
    • MyBatis-Plus(ORM框架)
    • Shiro(权限控制框架)
    • Jackson(JSON处理)
    • Thymeleaf(模板引擎)

2.3 审计重点方向

  1. 权限配置检查
  2. SQL注入漏洞
  3. SSRF漏洞
  4. 第三方依赖漏洞
  5. 敏感信息泄露
  6. 密码/密钥硬编码

3. 漏洞发现与分析

3.1 权限配置不当

  • 发现未授权访问接口:/trp/getTeacher
    • 泄露8000+条教师信息(姓名、工号、出生日期)
  • 权限注解缺失:
    • 缺少@RequiresPermissions注解的路由可匿名访问
    • 示例:可匿名删除CmsArticle内容

3.2 SQL注入潜在风险

  • MyBatis-Plus中发现${content.conName}动态SQL拼接
  • 注入条件:
    • 能控制文章标题(conName)
    • 访问/trp/cmsDefContenadd/list路由
  • 限制:
    • 创建/修改操作受权限控制,无法直接利用

3.3 Shiro反序列化漏洞

3.3.1 版本确认

  • Shiro版本:1.4.0
  • 默认密钥生成机制存在风险

3.3.2 密钥硬编码

  • 发现默认密钥配置:rememberMe_shiro_key
  • 密钥处理代码:
byte[] encryptKeyBytes = "rememberMe_shiro_key".getBytes(StandardCharsets.UTF_8);
String rememberKey = Base64.getEncoder().encodeToString(Arrays.copyOf(encryptKeyBytes, 16));

3.3.3 漏洞利用

  1. 使用上述代码生成Base64编码的AES密钥
  2. 利用Shiro反序列化工具(如ysoserial)进行攻击
  3. 通过RememberMe Cookie实现远程代码执行

4. 渗透测试方法论总结

4.1 系统化测试流程

  1. 全面信息收集:不放过任何可能暴露信息的接口
  2. 参数爆破:针对ID类参数进行系统化测试
  3. 源码深度审计:从配置文件到业务逻辑的全面检查

4.2 重点检查项

  • 权限配置:检查所有Controller的访问控制
  • SQL注入:搜索${}和动态SQL拼接
  • 框架漏洞:确认第三方库版本和配置
  • 密钥管理:检查硬编码密钥和加密配置

4.3 防御建议

  1. 避免使用动态SQL拼接,使用预编译语句
  2. 为所有业务接口配置明确的权限控制
  3. 自定义Shiro加密密钥,避免使用默认值
  4. 定期进行依赖库版本更新和安全审计

附录:关键代码片段

Shiro密钥生成代码

import java.util.Arrays;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import org.apache.shiro.crypto.AesCipherService;
import org.apache.shiro.util.ByteSource;

public class ShiroAESencode {
    public static void main(String[] args) throws Exception {
        byte[] encryptKeyBytes = "rememberMe_shiro_key".getBytes(StandardCharsets.UTF_8);
        String rememberKey = Base64.getEncoder().encodeToString(Arrays.copyOf(encryptKeyBytes, 16));
        System.out.println(rememberKey);
    }
}

MyBatis-Plus潜在注入点

<!-- mapper.xml 文件 -->
<select id="findListBySiteCode" resultType="xxx">
    SELECT * FROM table WHERE conName = '${content.conName}'
</select>

通过系统化的渗透测试方法,即使是教育类网站也可能存在严重的安全隐患,开发人员和安全团队应重视每个环节的安全防护。

大学渗透测试实战:从源码泄露到Shiro反序列化漏洞利用 1. 信息收集阶段 1.1 初始发现 目标URL: http://xxx.xxx.edu.cn/trp/file/desc?fileId=438 发现该接口返回文件下载地址(内网地址) 通过相似路由测试确认可访问性 1.2 文件泄露测试 对fileId参数进行爆破(000-999) 搜索响应中包含 .zip 和 .rar 的结果 成功获取源码压缩包(war格式) 2. 源码审计流程 2.1 工具准备 JD-GUI:用于反编译Java字节码 VS Code:用于代码搜索和分析 反编译技巧:Ctrl+Alt+S保存所有反编译源码 2.2 技术栈分析 框架识别: MyBatis-Plus(ORM框架) Shiro(权限控制框架) Jackson(JSON处理) Thymeleaf(模板引擎) 2.3 审计重点方向 权限配置检查 SQL注入漏洞 SSRF漏洞 第三方依赖漏洞 敏感信息泄露 密码/密钥硬编码 3. 漏洞发现与分析 3.1 权限配置不当 发现未授权访问接口: /trp/getTeacher 泄露8000+条教师信息(姓名、工号、出生日期) 权限注解缺失: 缺少 @RequiresPermissions 注解的路由可匿名访问 示例:可匿名删除 CmsArticle 内容 3.2 SQL注入潜在风险 MyBatis-Plus中发现 ${content.conName} 动态SQL拼接 注入条件: 能控制文章标题(conName) 访问 /trp/cmsDefContenadd/list 路由 限制: 创建/修改操作受权限控制,无法直接利用 3.3 Shiro反序列化漏洞 3.3.1 版本确认 Shiro版本:1.4.0 默认密钥生成机制存在风险 3.3.2 密钥硬编码 发现默认密钥配置: rememberMe_shiro_key 密钥处理代码: 3.3.3 漏洞利用 使用上述代码生成Base64编码的AES密钥 利用Shiro反序列化工具(如ysoserial)进行攻击 通过RememberMe Cookie实现远程代码执行 4. 渗透测试方法论总结 4.1 系统化测试流程 全面信息收集 :不放过任何可能暴露信息的接口 参数爆破 :针对ID类参数进行系统化测试 源码深度审计 :从配置文件到业务逻辑的全面检查 4.2 重点检查项 权限配置 :检查所有Controller的访问控制 SQL注入 :搜索 ${} 和动态SQL拼接 框架漏洞 :确认第三方库版本和配置 密钥管理 :检查硬编码密钥和加密配置 4.3 防御建议 避免使用动态SQL拼接,使用预编译语句 为所有业务接口配置明确的权限控制 自定义Shiro加密密钥,避免使用默认值 定期进行依赖库版本更新和安全审计 附录:关键代码片段 Shiro密钥生成代码 MyBatis-Plus潜在注入点 通过系统化的渗透测试方法,即使是教育类网站也可能存在严重的安全隐患,开发人员和安全团队应重视每个环节的安全防护。