【代码审计】某校园统一认证任意用户登录

admin 2026-02-04 17:42:48 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 该文档分享了针对某校园统一认证系统的代码审计案例,发现了任意用户登录漏洞。系统使用了硬编码密钥生成Token,导致权限校验失效。攻击者可利用UUID算法配合硬编码密钥计算Token,通过脚本自动化请求callback接口,最终获取管理员SSO权限。 综合评分: 82 文章分类: 代码审计,WEB安全,漏洞分析,漏洞POC


cover_image

【代码审计】某校园统一认证任意用户登录

原创

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) {
&nbsp; &nbsp;&nbsp;HashMap<String,&nbsp;String>map=newHashMap();
&nbsp; &nbsp;&nbsp;map.put("code",&nbsp;"-1");
&nbsp; &nbsp;&nbsp;map.put("message",&nbsp;"请求失败,请检查参数是否正确!");

&nbsp; &nbsp;&nbsp;if&nbsp;(StringUtils.isNotBlank(token)) {
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;// 1. Base64解码token
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;StringdecString=newString(Base64.getDecoder().decode(token));

&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;// 2. 按 "@_@" 分割
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;String[]&nbsp;decArray=decString.split("@_@");
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;Stringscript=decArray[0]; &nbsp;// script ID
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;Stringuser=decArray[1]; &nbsp; &nbsp;&nbsp;// 用户名
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;Stringtime=decArray[2]; &nbsp; &nbsp;&nbsp;// 时间戳
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;Stringverify=decArray[3]; &nbsp;&nbsp;// MD5验证码

&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;// 3. 时间验证(30秒有效期)
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;longcurrentTime=System.currentTimeMillis();
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;longt=Long.parseLong(time)&nbsp;+30000L; &nbsp;// 时间戳 + 30秒
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;if&nbsp;(currentTime<=t) {
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;// 4. MD5验证
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;StringverifyCode=MD5.encrypt(
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;script+"@_@"+user+"@@"+time+"41EBF3CB7CA80DA1"
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; );

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;if&nbsp;(verify.equals(verifyCode)) {
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;// 5. 验证成功,存入缓存
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;this.qrcodeCache.put(newElement(script,&nbsp;token));
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;map.put("code",&nbsp;"1");
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;map.put("message",&nbsp;"请求成功!");
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }
&nbsp; &nbsp; &nbsp; &nbsp; }
&nbsp; &nbsp; }
&nbsp; &nbsp;&nbsp;returnmap;
}

编写脚本自动化生成

获取管理员sso权限


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:0xSecurity acd28 acd28《【代码审计】某校园统一认证任意用户登录》

评论:0   参与:  0