WordPress Telegram 插件未授权接管管理员账号
红队安全圈
红队安全圈
红队安全圈
2026年10月29日 20:11
重庆
去阅读
一个 WordPress Telegram 购物插件,webhook 不验签、令牌可预测、兑换即登录——知道用户名就能接管管理员账号。
01 引言
插件 Bot for Telegram on WooCommerce 的作用是把 WooCommerce 商店接进 Telegram 机器人,用户在 TG 里就能逛店、下单。它注册了一个完全公开的 REST 端点 /wp-json/woo-telegram/v1/main/ 来接收 Telegram 官方推来的 webhook 更新——问题就出在这里:这个端点既不校验请求是不是真的来自 Telegram 的服务器,后续登录令牌的生成和兑换也全是可预测的。全部版本至 1.3.0(含)受影响,CVSS 9.8 Critical,条件极低:只要知道目标用户的用户名,不需要任何认证就能接管账号。
02 漏洞速览
漏洞编号CVE-2026-109516
影响产品Bot for Telegram on WooCommerce
影响版本≤ 1.3.0(1.3.1 已修复)
漏洞类型未授权认证绕过 → 账户接管
危害等级CVSS 9.8 Critical
在野利用暂无报告 / 暂无公开 PoC
攻击前提知道目标用户的用户名
03 漏洞成因
整条链由四个缺陷串起来,我翻了 1.3.0 的源码,每一环都能对上。
第一环:webhook 端点无鉴权。插件在 BFTOW\_Telegram.php 里注册 REST 路由时,权限回调直接写死放行:
register\_rest\_route(
'woo-telegram/v1', '/main/', array(
'methods' => ['GET', 'POST'],
'permission\_callback'
=> '\_\_return\_true',
'callback'
=> array($this, 'get\_tg\_data'),
));
Telegram 官方 webhook 是支持 secret\_token 校验的(请求头 X-Telegram-Bot-Api-Secret-Token),这个插件完全没用。也就是说任何人 POST 一段伪造的\"机器人更新\"JSON,插件都会当真处理。
第二环:chat.id 直接映射到 WordPress 用户。get\_tg\_data() 从请求体里取 message.chat.id,交给 bftow\_get\_user\_system\_id()。这个函数先按 bftow\_telegram\_chat\_id 这个 user meta 找用户,找不到就走兜底逻辑:
$user = get\_user\_by('login',
$tgId);
if($user) {
update\_user\_meta($user->ID,
'bftow\_telegram\_chat\_id',
$tgId);
return $user->ID;
}
没有要求任何所有权证明:攻击者在 JSON 里把 chat.id 写成 admin 的登录名,这个函数就把 admin 的用户 ID 还回来。
第三环:登录令牌可预测。用户登录令牌的生成在 BFTOW\_User.php 里:
update\_user\_meta($userId,
'bftow\_user\_token',
md5( $client . time() ) );
client 取自 $\_SERVER['HTTP\_USER\_AGENT']——攻击者自己发请求,UA 当然自己定;time() 是服务器当前时间戳,响应头的 Date 字段把它缩小到秒级。两个输入全部可控或可猜,md5 结果就是明牌。
第四环:令牌兑换即登录。拿到令牌后访问 ?action=bftow\_create\_order&bftow\_token=...,BFTOW\_WooCommerce.php 的 set\_user\_from\_token() 按 bftow\_user\_token meta 反查用户,然后无条件调用:
$user->login\_user\_by\_id(
$this->user\_id);
// 内部:
wp\_set\_auth\_cookie($user\_id,
true, false);
没有能力检查、没有 nonce、没有来源限制,直接给攻击者签发该账号的持久化认证 Cookie。至此,任意账号接管完成。
04 影响范围
受影响:Bot for Telegram on WooCommerce 全部版本至 1.3.0(含)。
已修复:1.3.1 及以上。
05 利用分析
利用不需要任何插件配置以外的信息,三步:
第 1 步:伪造 webhook,写死目标用户名。向 /wp-json/woo-telegram/v1/main/ POST 一段仿造的 Telegram 更新,message.chat.id 填目标登录名(如 admin)。这一步会触发兜底逻辑,把 admin 的用户 ID 解析出来,并给这个账号写入一个用 md5(UA + time()) 算出的新令牌。
第 2 步:算出令牌。自己的请求 UA 自己定,服务器时间从响应的 Date 头拿,本地枚举 time() ±几秒的取值逐个 md5,几秒内必中。
第 3 步:兑换令牌登录。访问:
https://target/?
action=bftow\_create\_order
&bftow\_token=
服务器执行 wp\_set\_auth\_cookie(),浏览器拿到 admin 的登录态,直接进后台。
06 检测与排查
判断自己是否装了受影响插件:
curl -s https://目标站/wp-content/
plugins/
bot-for-telegram-on-woocommerce/
readme.txt | grep -i \"stable tag\"
返回 1.3.0 及以下即受影响。也可看后台插件页版本号。更直接的验证:向 /wp-json/woo-telegram/v1/main/ 随便 POST 一个 JSON,返回非 401/403(端点存在且公开处理)就该警惕了。
07 修复建议
立即升级插件到 1.3.1 或更新版本。
若暂时不能升级且用不到 TG 购物功能,直接停用插件。
管理员账号启用双因素,并检查近期可疑登录。
全站用户如果令牌已被写过,升级后建议重新登录一次刷新会话。
08 红队视角
这个洞的价值在于门槛极低、链路自洽:无认证入口、用户名即密钥、令牌可预测、兑换即登录,四个环节凑齐了一条教科书式的认证绕过。实战里管理员的用户名往往不是秘密——/?author=1 重定向、文章作者归档、REST 用户枚举 /wp-json/wp/v2/users 都能拿到。
对蓝队来说,重点检查的不只是插件版本,还要看 WAF 有没有对这个 REST 端点的异常 POST;对红队来说,遇到 WooCommerce 站点,把\"TG 机器人插件\"加进指纹清单,命中率高得超预期。这也是个老提醒:webhook 类功能必须验签,\_\_return\_true 这种权限回调出现在生产代码里,基本等于给互联网留了后门。
想要文中检测命令 / 令牌推算思路清单的,留言说一声;关注不迷路,更新看得见。
— END —
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论