乐于分享
好东西不私藏

某微盘系统后台认证绕过漏洞源码审计与本地复现

某微盘系统后台认证绕过漏洞源码审计与本地复现

漏洞类型: 权限绕过 / 认证绕过(Cookie 伪造)影响范围: 某微盘系统(ThinkPHP 5.0.5 框架)测试环境: 本地复现环境测试地址: 127.0.0.1分析方式: 源码审计 + 本地验证


一、漏洞概述

本文通过对某微盘系统源码进行审计,发现其后台认证逻辑存在一个认证绕过问题。

该系统的后台权限判断完全依赖客户端 Cookie,且服务端用于校验登录状态的 token 是硬编码的固定值。攻击者只需构造一个满足条件的 Cookie,即可绕过正常登录流程,直接进入后台管理功能。

本文仅在本地搭建的测试环境中进行源码分析与漏洞复现,不涉及任何真实目标。


二、测试环境

系统:Windows

运行环境:PHPStudy(PHP 7.x + Apache)

框架:ThinkPHP 5.0.5

数据库:MySQL

访问地址:

http://127.0.0.1:4321

三、漏洞发现过程

本次漏洞并非从现成 PoC 入手,而是从后台功能进行源码审计。

首先访问系统后台,抓取请求包。后台入口为:

http://127.0.0.1:4321/index.php/admin/index/index

从请求中可以观察到,未登录状态访问后台会跳转到登录页。此时注意到请求中携带了一个 denglu Cookie,这是后台权限判断的关键。

请求方法:GET请求路径:/index.php/admin/index/index关键参数:Cookie: denglu=think:...

根据 ThinkPHP 的模块/控制器/操作路由规则(模块/控制器/方法),定位到后台控制器的基类 Base。


四、源码审计

4.1 权限来源定位

后台所有控制器都继承自 Base 类,认证逻辑统一写在它的构造函数 __construct 里:

classBaseextendsController{    public function __construct(){        parent::__construct();        //验证登录        $login = cookie('denglu');          // 权限来源        if(!isset($login['userid'])){       // 判断 userid 是否存在            $this->error('请先登录!','login/login',1,1);        }        if(!isset($login['token']) || $login['token'] != md5('bushishuaige')){            $this->redirect('login/logout');   // token 硬编码校验        }        $this->otype = $login['otype'];        // 信任 Cookie 中的角色        $this->uid   = $login['userid'];       // 信任 Cookie 中的用户ID    }}

4.2 认证判断分析

从代码可以看到完整的认证流程:

Cookie denglu    ↓判断 userid 是否存在    ↓判断 token 是否等于 md5(固定字符串)    ↓认证通过,进入后台

这里存在两个关键问题:

问题一:权限来源完全由客户端 Cookie 决定。$login = cookie('denglu') 直接读取客户端提交的 Cookie,没有任何服务端 Session 兜底。也就是说,攻击者可以完全控制 denglu 的内容。

问题二:token 是硬编码的固定值。$login['token'] != md5('xxxx') 中的校验值被写死在代码里。只要拿到这段源码(或通过其他方式获知该固定字符串),攻击者就能自己算出 md5 值,伪造出合法的 token。


五、漏洞成因

综合源码分析,完整的数据流程如下:

客户端请求    ↓携带 Cookie denglu    ↓Base 构造函数读取 cookie('denglu')    ↓userid 存在 + token == md5(硬编码固定值)    ↓认证通过,进入后台

漏洞根因在于:后台的登录态完全由客户端可控的 Cookie 决定,且用于校验的 token 是硬编码的固定字符串,可被预测和伪造。

核心问题:

  1. 认证依赖客户端 Cookie,无服务端 Session 校验;
  2. token 校验值硬编码在源码中,可被预测;
  3. 角色(otype)和用户 ID(userid)直接信任 Cookie,可被任意指定。

因此攻击者只要构造一个包含 userid、token、otype 三个字段的 Cookie,即可绕过正常登录流程。


六、本地漏洞复现

在本地测试环境访问后台:

http://127.0.0.1:4321/index.php/admin/index/index

未登录时,页面会跳转到登录页。

随后构造 Cookie。ThinkPHP 的 Cookie 为 think: 前缀 + JSON 数组格式,其中 denglu 的值结构为:

denglu = think:{”userid”:”1”,”token”:””,”otype”:”1”}

其中:

  • userid
    :任意非空值,代表登录用户 ID;
  • token
    md5(硬编码固定字符串) 的计算结果;
  • otype
    :管理员角色对应的值。
对该硬编码固定值进行md5加密

携带拼接过的Cookie 重新请求后台页面,请求成功后直接进入后台管理界面。

复现结果表明:

正常登录流程      ↓      被绕过      ↓后台页面成功访问

至此确认该漏洞在本地环境中可以稳定复现。


七、漏洞影响

该问题可能导致未经授权的用户访问后台管理功能。

根据后台实际权限和功能,潜在影响包括:

  • 未授权访问后台管理功能
  • 获取后台业务信息
  • 访问敏感配置
  • 以管理员身份执行未授权业务操作

实际影响需要结合具体后台权限和业务功能进一步评估。


八、修复建议

建议:

  1. 避免使用固定、可预测的 Cookie 作为唯一认证依据;
  2. 登录成功后重新生成随机的 Session 标识,并在服务端保存会话状态;
  3. 后台接口统一进行服务端身份认证,而非信任客户端 Cookie;
  4. 对敏感管理操作进一步实施细粒度的权限校验;
  5. 移除源码中的硬编码密钥,改用随机生成的密钥并通过配置文件管理。

九、总结

本次通过对某微盘系统后台功能进行源码审计,从请求路由定位到 Base 控制器,再进一步分析 Cookie 处理及后台认证逻辑,最终发现并复现了一个认证绕过问题。

本次分析过程可以概括为:

后台功能 ↓抓包 ↓定位路由 ↓ControllerBase 基类) ↓cookie('denglu') 权限来源 ↓硬编码 token 校验 ↓发现安全边界问题 ↓构造 Cookie ↓本地复现

通过这种方式,可以在没有现成 PoC 的情况下,从源码中的业务逻辑和安全边界出发发现潜在漏洞。

免责声明:本文仅用于网络安全技术研究与学习,漏洞复现均在本地测试环境进行,请勿用于未经授权的系统。