验证码外部控制(绕过)实例
字数 1091 2025-08-26 22:11:15

ThinkCMF 1.X-2.X 验证码外部控制漏洞分析与利用

漏洞概述

ThinkCMF 1.X至2.X版本中存在验证码外部控制漏洞,攻击者可以通过控制验证码生成参数来固定验证码内容,从而绕过验证码保护机制,实现暴力破解等攻击。

受影响版本

  • ThinkCMF 1.5
  • ThinkCMF 1.6
  • ThinkCMF 2.X

漏洞细节

验证码生成URL结构

ThinkCMF 1.5版本的验证码生成URL:

http://target/index.php?g=Api&m=Checkcode&a=index&code_len=4&font_size=15&width=100&height=35&charset=1234567890

ThinkCMF 1.6版本的验证码生成URL:

http://target/1.6/index.php?g=Api&m=Checkcode&a=index&length=4&font_size=25&width=238&height=50

关键漏洞点

  1. charset参数可控:攻击者可以通过charset参数指定验证码字符集,从而控制验证码内容
  2. 验证码复用问题:在1.5版本中,验证码可以重复使用
  3. 参数注入:1.6版本虽然前端代码没有提供charset参数,但后端代码仍然支持该参数

漏洞代码分析

关键文件路径:

1.6/application/Api/Controller/CheckcodeController.class.php

关键代码片段:

$code_set="";
if(isset($_GET['charset'])){
    $code_set= trim($_GET['charset']);
}

$config = array(
    'codeSet' => !empty($code_set)?$code_set:"2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY",
    // 其他配置参数...
);

代码逻辑:

  1. 检查是否存在charset GET参数
  2. 如果存在,则使用用户提供的字符集
  3. 如果不存在,则使用默认字符集

漏洞验证方法

ThinkCMF 1.5验证

  1. 访问验证码生成URL并设置固定字符集:
http://target/index.php?g=Api&m=Checkcode&a=index&charset=2222
  1. 多次刷新验证码,观察验证码是否始终为"2222"

ThinkCMF 1.6验证

  1. 访问验证码生成URL并手动添加charset参数:
http://target/1.6/index.php?g=Api&m=Checkcode&a=index&charset=3333
  1. 多次刷新验证码,观察验证码是否始终为"3333"

漏洞利用

暴力破解攻击流程

  1. 固定验证码:首先访问验证码生成URL并设置固定字符集
    http://target/index.php?g=Api&m=Checkcode&a=index&charset=8888
    
  2. 获取会话Cookie:从响应中获取会话Cookie
  3. 构造攻击请求:使用固定的验证码"8888"和获取的Cookie发送登录请求
  4. 自动化攻击:重复上述过程进行用户名/密码暴力破解

特殊场景利用

当遇到以下情况时仍可利用:

  • 后台登录验证模块被删除但登录界面存在
  • 注册页面被删除
  • 前台登录模块验证码被删除但后端仍检查验证码

利用方法:

  1. 先请求带有固定charset参数的验证码URL
  2. 再发送包含固定验证码的登录请求

其他潜在风险

  1. DDoS攻击:通过控制widthheight参数生成超大验证码图片,消耗服务器资源
  2. 验证码失效:1.5版本验证码可复用问题

修复建议

  1. 升级到最新版本的ThinkCMF

  2. 临时修复方案:

    • 修改CheckcodeController.class.php,移除对charset参数的支持
    • 强制使用随机生成的字符集
    • 为验证码添加一次性使用限制
  3. 代码层面修复示例:

// 移除charset参数支持
$config = array(
    'codeSet' => "2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY",
    // 其他配置参数...
);

总结

该漏洞允许攻击者完全控制验证码内容,绕过验证码保护机制,对系统安全构成严重威胁。建议所有使用ThinkCMF的用户立即检查并修复此问题。

ThinkCMF 1.X-2.X 验证码外部控制漏洞分析与利用 漏洞概述 ThinkCMF 1.X至2.X版本中存在验证码外部控制漏洞,攻击者可以通过控制验证码生成参数来固定验证码内容,从而绕过验证码保护机制,实现暴力破解等攻击。 受影响版本 ThinkCMF 1.5 ThinkCMF 1.6 ThinkCMF 2.X 漏洞细节 验证码生成URL结构 ThinkCMF 1.5版本的验证码生成URL: ThinkCMF 1.6版本的验证码生成URL: 关键漏洞点 charset参数可控 :攻击者可以通过 charset 参数指定验证码字符集,从而控制验证码内容 验证码复用问题 :在1.5版本中,验证码可以重复使用 参数注入 :1.6版本虽然前端代码没有提供 charset 参数,但后端代码仍然支持该参数 漏洞代码分析 关键文件路径: 关键代码片段: 代码逻辑: 检查是否存在 charset GET参数 如果存在,则使用用户提供的字符集 如果不存在,则使用默认字符集 漏洞验证方法 ThinkCMF 1.5验证 访问验证码生成URL并设置固定字符集: 多次刷新验证码,观察验证码是否始终为"2222" ThinkCMF 1.6验证 访问验证码生成URL并手动添加charset参数: 多次刷新验证码,观察验证码是否始终为"3333" 漏洞利用 暴力破解攻击流程 固定验证码 :首先访问验证码生成URL并设置固定字符集 获取会话Cookie :从响应中获取会话Cookie 构造攻击请求 :使用固定的验证码"8888"和获取的Cookie发送登录请求 自动化攻击 :重复上述过程进行用户名/密码暴力破解 特殊场景利用 当遇到以下情况时仍可利用: 后台登录验证模块被删除但登录界面存在 注册页面被删除 前台登录模块验证码被删除但后端仍检查验证码 利用方法: 先请求带有固定 charset 参数的验证码URL 再发送包含固定验证码的登录请求 其他潜在风险 DDoS攻击 :通过控制 width 和 height 参数生成超大验证码图片,消耗服务器资源 验证码失效 :1.5版本验证码可复用问题 修复建议 升级到最新版本的ThinkCMF 临时修复方案: 修改 CheckcodeController.class.php ,移除对 charset 参数的支持 强制使用随机生成的字符集 为验证码添加一次性使用限制 代码层面修复示例: 总结 该漏洞允许攻击者完全控制验证码内容,绕过验证码保护机制,对系统安全构成严重威胁。建议所有使用ThinkCMF的用户立即检查并修复此问题。