文章总结: 该文档分享了针对某校园统一认证系统的代码审计案例,发现了任意用户登录漏洞。系统使用了硬编码密钥生成Token,导致权限校验失效。攻击者可利用UUID算法配合硬编码密钥计算Token,通过脚本自动化请求callback接口,最终获取管理员SSO权限。 综合评分: 82 文章分类: 代码审计,WEB安全,漏洞分析,漏洞POC
【代码审计】某校园统一认证任意用户登录
原创
acd28 acd28
0xSecurity
2026年2月4日 11:26 广东
查看页面
用的 Pac4j 做的权限校验 ( 近似于无校验 ),UUID生成
@RequestMapping({"/uuid"})
@ResponseBody
publicStringuuid() {
longuuid;
// 循环生成UUID,确保在缓存中唯一
for (uuid=UUIDUtil.createSessionID();
this.qrcodeCache.isKeyInCache(uuid);
uuid=UUIDUtil.createSessionID()) {
}
returnuuid+""; // 返回UUID字符串
}
UUID 获取
硬编码密钥:41EBF3CB7CA80DA1,根据 UUID 算出 token
Callback验证,带着 uuid 去请求 polling 即可获得跳转后的连接
@RequestMapping({"/callback"})
@ResponseBody
publicObjectcallback(@RequestParamStringtoken,
HttpServletRequestrequest,
HttpServletResponseresponse) {
HashMap<String, String>map=newHashMap();
map.put("code", "-1");
map.put("message", "请求失败,请检查参数是否正确!");
if (StringUtils.isNotBlank(token)) {
// 1. Base64解码token
StringdecString=newString(Base64.getDecoder().decode(token));
// 2. 按 "@_@" 分割
String[] decArray=decString.split("@_@");
Stringscript=decArray[0]; // script ID
Stringuser=decArray[1]; // 用户名
Stringtime=decArray[2]; // 时间戳
Stringverify=decArray[3]; // MD5验证码
// 3. 时间验证(30秒有效期)
longcurrentTime=System.currentTimeMillis();
longt=Long.parseLong(time) +30000L; // 时间戳 + 30秒
if (currentTime<=t) {
// 4. MD5验证
StringverifyCode=MD5.encrypt(
script+"@_@"+user+"@@"+time+"41EBF3CB7CA80DA1"
);
if (verify.equals(verifyCode)) {
// 5. 验证成功,存入缓存
this.qrcodeCache.put(newElement(script, token));
map.put("code", "1");
map.put("message", "请求成功!");
}
}
}
returnmap;
}
编写脚本自动化生成
获取管理员sso权限
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:0xSecurity acd28 acd28《【代码审计】某校园统一认证任意用户登录》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论