Kimdir01/kleeja-auth-bypass-rce-cve
GitHub: Kimdir01/kleeja-auth-bypass-rce-cve
针对 Kleeja PHP 文件共享应用的多个严重漏洞(含认证绕过与 RCE)的安全审计报告与概念验证代码。
Stars: 0 | Forks: 0
# GitHub 安全公告:Kleeja 文件共享 — 通过 Cookie 伪造 + PHP 对象注入实现的关键认证绕过
## 公告信息
| 字段 | 值 |
|-------|-------|
| **严重程度** | 关键 |
| **CWE** | CWE-502 (反序列化) / CWE-287 (认证绕过) / CWE-327 (弱加密) |
| **CVSS v3.1** | 9.8 (Cookie 伪造 + 反序列化) / 8.8 (.htaccess 绕过 RCE) |
| **CVSS Vector** | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
## 摘要
Kleeja(191 个 Star,PHP 文件共享应用)包含多个严重漏洞:(1) 通过 Cookie 伪造实现认证绕过 —— 该 Cookie 的“加密”使用了极易被逆向的替换密码,且解密后的 Cookie 被传给 `unserialize()`,从而引发 PHP 对象注入;(2) Cookie 中的 `$group_id` 由攻击者控制,允许其将权限提升至管理员;(3) 在 PHP 7+/FPM 环境下,`.htaccess` 中防止 PHP 执行的机制失效;(4) 文件上传的内容校验可被轻易绕过。
## 漏洞详情
### 受影响的包/仓库
- **仓库:** `kleeja-official/kleeja`
- **受影响版本:** 当前版本
- **修复版本:** 暂无 (0-day)
**审计的 Commit Hash:** `48e42911e1c0b13c5754a154e8d510ebf84e7880`
## CVE-REQUEST-001:通过 Cookie 实现认证绕过 + PHP 对象注入 (CVSS 9.8)
**文件:** `includes/usr.php`,第 420-437 行(Cookie 解析),第 348-390 行(加密)
**存在漏洞的 Cookie 创建(第 144 行):**
```
$user_y = base64_encode(serialize([
'id' => $row['id'], 'name' => $row['name'],
'mail' => $row['mail'], 'last_visit' => $row['last_visit']
]));
```
**存在漏洞的 Cookie 解析(第 420-437 行):**
```
list($user_id, $hashed_password, $expire_at, $hashed_expire, $group_id, $u_info) =
@explode('|', $this->en_de_crypt($this->kleeja_get_cookie('ulogu'), 2));
// ...
$userinfo = unserialize(base64_decode($u_info)); // PHP OBJECT INJECTION!
$userinfo['group_id'] = $group_id; // GROUP FROM COOKIE!
define('GROUP_ID', $userinfo['group_id']); // ATTACKER-CONTROLLED
```
**加密缺陷(第 348-390 行):**
```
function en_de_crypt($data, $type = 1) {
$chars = str_split($config['h_key']);
foreach (range('a', 'z') as $k => $v) {
if (!isset($chars[$k])) break;
$txt[$v] = $chars[$k] . $k . '-';
}
// Simple character substitution cipher, not encryption
}
```
`en_de_crypt()` 函数根本不是加密 —— 它仅仅是一个字符替换密码。最多只有 26 个字符被替换。攻击者只需注册一个账户、接收 Cookie 并观察映射关系,就能逆向推导出密钥,进而伪造带有 `group_id=1`(管理员)的 Cookie。
**攻击向量:**
1. 注册一个用户账户 → 接收 Cookie
2. 对 Cookie 进行 Base64 解码 → 观察替换规律
3. 伪造一个带有 `$group_id=1`(管理员组)的 Cookie
4. 将 `$u_info` 设置为精心构造的序列化 PHP 对象 → 利用 POP 链触发对象注入
## CVE-REQUEST-002:.htaccess 绕过 — 在 PHP 7+/FPM 上执行 PHP 代码 (CVSS 8.8)
**文件:** `uploads/.htaccess`
```
php_flag engine off # ONLY for mod_php5!
```
在 PHP 7.x、8.x 或任何 FPM/FastCGI 环境下,`mod_php5.c` 并不存在,因此 `php_flag engine off` 永远不会被执行。PHP 执行功能处于开启状态。结合文件上传绕过漏洞,上传的 `.php` 文件将能够被执行。
**扩展名校验中的额外 .htaccess 绕过:**
```
// includes/up_helpers/others.php, lines 23-48
$tmp = explode('.', $filename);
if (sizeof($tmp) < 3) {
return true; // BUG: .htaccess → 2 parts → ALWAYS PASSES
}
```
文件名 `.htaccess` 在经过 `explode('.')` 处理后只有 2 个部分,因此它总是能通过安全检查。
## CVE-REQUEST-003:文件上传绕过 — 大于 6MB 的文件中包含 PHP 代码 (CVSS 7.8)
**文件:** `includes/up_helpers/others.php`,第 259-280 行
```
// Files > 6MB SKIP content check entirely
if (@filesize($file_path) > 6*(1000*1024)) {
return true;
}
// Incomplete PHP code detection blacklist:
$maybe_bad_codes_are = ['