1. 项目背景与目标
去年夏天,我接到某高校信息中心的委托,对校内证书管理系统进行一次完整的安全评估。这个系统承载着全校师生各类证书的申请、审核和发放功能,存储着大量敏感信息。校方在例行检查中发现系统存在一些异常访问记录,但无法确定是否存在实质性漏洞。
这类教育系统的安全测试有几个特殊之处:
- 用户群体复杂(教职工、学生、访客)
- 系统通常由多个历史版本组件拼凑而成
- 业务逻辑往往存在"教学便利性优先"的设计倾向
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 信息收集阶段
2.1 基础架构探测
使用Nmap进行基础扫描时发现几个有趣的现象:
code复制nmap -sV -O 192.168.1.100
返回结果显示系统运行着:
- Apache 2.4.6 (CentOS)
- OpenSSL 1.0.1e
- PHP 5.4.16
这套组合存在多个已知漏洞:
- CVE-2015-4000 (Logjam)
- CVE-2014-3566 (POODLE)
- PHP 5.4的多个RCE漏洞
2.2 目录枚举发现
使用DirBuster扫描时,发现了一个意外的目录结构:
code复制/certadmin/backup/2020/
该目录下存放着未经加密的数据库备份文件(.sql.gz),通过分析这些文件,我们获得了:
- 完整的数据库结构
- 历史用户数据(含部分明文密码)
- 管理员操作日志
3. 漏洞挖掘与分析
3.1 证书生成接口的IDOR漏洞
系统存在一个关键接口:
code复制POST /api/gen_cert
参数:{uid:123, type:"honor"}
测试发现:
- 修改uid参数可以生成任意用户的证书
- type参数存在SQL注入点:
sql复制type=' union select 1,2,3,4,5-- - - 接口未做速率限制,可批量生成证书
3.2 文件上传功能绕过
证书上传功能声称只允许PDF文件,但实际校验存在缺陷:
- 前端仅检查文件扩展名
- 后端使用不完整的MIME检查:
php复制if($_FILES['cert']['type'] == 'application/pdf') - 通过修改Content-Type和文件头,成功上传含恶意代码的"PDF"文件
4. 权限提升路径
4.1 管理员会话劫持
在分析JS文件时发现一个调试接口泄露:
javascript复制// debug.js
function getAdminToken(){
return localStorage.getItem('debug_token');
}
通过构造特殊请求获取到管理员令牌:
code复制GET /debug/console?cmd=getToken HTTP/1.1
4.2 数据库写权限滥用
利用前期获取的数据库凭据,直接修改用户表:
sql复制UPDATE users SET is_admin=1 WHERE username='test';
这种操作在MySQL日志中会留下明显记录,但系统审计功能存在缺陷,日志仅保留最近3天。
5. 横向移动测试
5.1 内网服务发现
通过被攻陷服务器发现内网存在:
- 学生成绩管理系统(10.0.1.12)
- 一卡通消费系统(10.0.1.15)
- 图书馆管理系统(10.0.1.18)
5.2 凭证复用攻击
使用证书系统中获取的密码尝试登录其他系统,成功率高达23%。最严重的是图书馆系统使用了相同的管理员密码。
6. 安全加固建议
6.1 紧急修复措施
- 立即关闭/debug目录访问
- 重置所有管理员会话令牌
- 删除/certadmin/backup目录下的文件
6.2 长期改进方案
- 实施最小权限原则:
nginx复制location /api/ { allow 192.168.1.0/24; deny all; } - 引入Web应用防火墙规则:
bash复制modsecurity_rules ' SecRule ARGS "@contains union" "deny,status:403" ' - 建立完整的日志审计体系,日志保留至少180天
7. 测试经验总结
在这次渗透测试中,有几个值得注意的发现:
- 教育系统往往存在"历史包袱"问题,多个不同时期开发的子系统共用凭证体系
- 开发人员在调试阶段留下的后门接口,常常成为突破口
- 文件上传功能的校验需要多层防御:
- 文件头校验
- 扩展名白名单
- 内容类型检查
- 病毒扫描
实际测试时,我习惯先检查以下几个关键点:
- 查看robots.txt是否暴露敏感路径
- 检查JS源码中的注释和调试代码
- 测试所有参数是否都做了严格类型检查
- 验证每个接口的权限控制是否前后一致
最后提醒一点:在高校系统测试中要特别注意保护学生隐私数据,所有测试数据应当使用脱敏后的模拟数据。
