thinkphp 6.0.12 不存在官方定义的“控制器权限绕过漏洞”,真实风险源于开发者未在控制器中显式校验身份与权限;审计需聚焦路由暴露、基类拦截、动态调用及会话/token校验可靠性。

ThinkPHP 6.0.12 本身不提供“控制器权限绕过漏洞”的官方定义或CVE编号,该说法常见于对业务层权限控制缺失的误称。真实风险来自开发者未在控制器中显式校验用户身份与操作权限,而非框架自身存在通用跳过鉴权的机制。审计重点不是找框架后门,而是确认每个可访问路由是否都具备有效的权限拦截逻辑。
确认路由是否暴露在未认证/未授权状态下
从入口开始梳理:检查 app/route/app.php 或模块级路由文件,找出所有 未被中间件包裹 的控制器方法。重点关注:
- 使用
get()、post()、any()直接注册的闭包路由(极易遗漏鉴权) - 通过
rule->allowCrossDomain()或rule->append()动态追加的路由(常绕过主路由配置) - 带通配符的路由如
'admin/<action>'</action>,若对应控制器未做$this->checkAuth()类校验,攻击者可直接调用任意 public 方法
检查控制器基类与前置逻辑是否统一拦截
多数项目会继承 app/BaseController.php。审计时需确认该基类的 __construct() 或 initialize() 方法中是否强制执行了权限判断:
- 是否存在
!$this->auth->check() && $this->error('未登录')这类兜底逻辑 - 是否对敏感模块(如
admin/、api/v1/user)做了白名单放行,而非黑名单过滤 - 注意
allowCrossDomain()、crossAllow()等跨域配置不会影响权限,切勿误以为开启 CORS 就等于开放访问
识别动态方法调用导致的权限失效点
这是最隐蔽也最危险的一类——权限校验存在,但被后续逻辑绕过。典型模式包括:
- 在
index()中校验了权限,但又根据input('action')动态调用$this->{input('action')}(),而目标方法内部无二次校验 - 使用
invokeMethod()或反射执行私有方法,跳过了 public 方法的访问控制边界 - 通过
call_user_func_array([$this, $method], $args)调用,且$method来自 URL 参数或表单字段(如?m=delete&id=123)
验证 session 和 token 是否被正确绑定与校验
即使写了 checkLogin(),若其实现依赖不可靠的数据源,权限形同虚设:
- 检查是否直接读取
$_SESSION['user_id']而非走think\facade\Session::get('user_id'),避免因 session 配置异常导致绕过 - 确认 JWT 或 API Token 校验是否在每次请求都执行,而非仅在登录接口中验证一次
- 留意
middleware/auth是否被错误地设置为except某些方法,却忘了排除__call()或魔术方法
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











