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