某次大学的渗透测试经历
字数 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 审计重点方向
- 权限配置检查
- 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 - 密钥处理代码:
byte[] encryptKeyBytes = "rememberMe_shiro_key".getBytes(StandardCharsets.UTF_8);
String rememberKey = Base64.getEncoder().encodeToString(Arrays.copyOf(encryptKeyBytes, 16));
3.3.3 漏洞利用
- 使用上述代码生成Base64编码的AES密钥
- 利用Shiro反序列化工具(如ysoserial)进行攻击
- 通过RememberMe Cookie实现远程代码执行
4. 渗透测试方法论总结
4.1 系统化测试流程
- 全面信息收集:不放过任何可能暴露信息的接口
- 参数爆破:针对ID类参数进行系统化测试
- 源码深度审计:从配置文件到业务逻辑的全面检查
4.2 重点检查项
- 权限配置:检查所有Controller的访问控制
- SQL注入:搜索
${}和动态SQL拼接 - 框架漏洞:确认第三方库版本和配置
- 密钥管理:检查硬编码密钥和加密配置
4.3 防御建议
- 避免使用动态SQL拼接,使用预编译语句
- 为所有业务接口配置明确的权限控制
- 自定义Shiro加密密钥,避免使用默认值
- 定期进行依赖库版本更新和安全审计
附录:关键代码片段
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>
通过系统化的渗透测试方法,即使是教育类网站也可能存在严重的安全隐患,开发人员和安全团队应重视每个环节的安全防护。