rideckszz/poc-CVE-2019-9053
GitHub: rideckszz/poc-CVE-2019-9053
针对CVE-2019-9053(CMS Made Simple <= 2.2.9 time-based blind SQL注入)的Python 3教学型PoC,专为CTF和实验室环境优化了数据提取速度。
Stars: 1 | Forks: 0
# PoC CVE-2019-9053 - CMS Made Simple SQL 注入
这是一个使用 Python 3 编写的针对 CVE-2019-9053 的教学性质 PoC,该漏洞是存在于 CMS Made Simple <= 2.2.9 中的 time-based blind SQL Injection 漏洞。
此版本针对 CTF/实验室环境进行了修改。它预配置了一些前缀以减少提取时间,并提供了中文(注:原指葡语,在此根据要求翻译为目标语言中文)的说明信息,以帮助学生理解该 exploit 的运行原理。
## 警告
本项目仅供教育、受控实验室环境和 CTF 环境使用。
未经明确授权,请勿将此代码用于第三方系统。
本仓库作者不对本材料的滥用承担责任。
## 漏洞信息
CVE-2019-9053 影响旧版本的 CMS Made Simple,允许通过以下 endpoint 中的 `m1_idlist` 参数进行未授权的 SQL Injection:
```
/moduleinterface.php?mact=News,m1_,default,0
```
由于 SQL 查询的响应不会直接显示在页面上,因此该 exploit 使用了一种称为 **time-based blind SQL Injection** 的技术。
## exploit 工作原理
该 exploit 发送的 payload 会在条件为真时,使数据库执行 `sleep(1)`。
概念示例:
```
AND (
SELECT sleep(1)
FROM cms_users
WHERE password LIKE '0c01%'
)
```
如果服务器响应出现延迟,脚本就会判定测试的前缀是正确的。
通过这种方式,它会逐个字符地还原敏感信息,例如:
- 密码 salt
- 用户名
- 电子邮件
- 密码 hash
在此 CTF 版本中,代码中已经包含了一些前缀,以减少活动期间所需的时间。
## 什么是 time-based blind SQL Injection?
当应用程序将用户可控的数据插入到 SQL 查询中而未进行适当处理时,就会发生 SQL Injection。
在这个例子中,它是 **blind**(盲注)的,因为查询结果不会直接显示在 HTTP 响应中。
它之所以是 **time-based**(基于时间)的,是因为攻击者利用服务器的响应时间作为反馈渠道。如果测试的条件为真,数据库就会通过 `sleep()` 产生延迟。如果为假,则正常返回响应。
简化示例:
```
Pergunta feita pelo exploit:
"O hash da senha começa com 0c01?"
Se sim:
O banco executa sleep(1), e a resposta demora.
Se não:
A resposta vem sem atraso perceptível.
```
通过逐个字符重复此过程,即使页面上没有直接显示数据库中的值,exploit 也能将其还原出来。
## 什么是 salt?
salt 是在生成 hash 之前与密码一起使用的一个额外值。
在这个挑战中,CMS Made Simple 使用了类似于以下的逻辑:
```
md5(salt + password)
```
例如:
```
salt = 1dac0d92e9fa6bb2
password = exemplo123
```
hash 将根据以下内容进行计算:
```
1dac0d92e9fa6bb2exemplo123
```
salt 的作用是增加预计算表(如彩虹表)攻击的难度,并确保相同的密码在不同的上下文中能生成不同的 hash。
尽管如此,`md5(salt + password)` 仍然是一种过时且脆弱的密码存储方式。现代系统应当使用专门的密码算法,例如:
- Argon2
- bcrypt
- scrypt
- PBKDF2
## 此 CTF 版本的修改说明
此版本经过调整,以便在实际操作中更易于使用。
主要更改包括:
- 代码已更新至 Python 3。
- 提供了中文(原意指母语,此处对应翻译)的说明性横幅。
- 在终端中简要解释 exploit 的工作原理。
- 包含已知前缀以加快提取速度。
- 针对十六进制格式的 salt 和 hash 优化了字符集 (Charset)。
- 限制了 salt 和 hash 的长度。
- 提供了使用 wordlist 进行破解的选项。
挑战中使用的值:
```
Salt completo: 1dac0d92e9fa6bb2
Username: mitch
Email: admin@admin.com
Hash completo: 0c01f4468bd75d7a84c7eb73846e8d96
```
exploit 中配置的前缀:
```
Salt prefix: 1dac0d92
Username prefix: mit
Email prefix: admin@
Hash prefix: 0c01f446
```
这些前缀并没有改变攻击的核心逻辑。它们只是减少了实验室活动所需的时间。
## 仓库结构
```
poc-CVE-2019-9053/
├── exploit_ctf.py
├── requirements.txt
├── README.md
├── wordlist-example.txt
└── .gitignore
```
## 环境要求
- Python 3
- requests
- termcolor
## 安装说明
克隆仓库:
```
git clone https://github.com/SEU_USUARIO/poc-CVE-2019-9053.git
cd poc-CVE-2019-9053
```
创建虚拟环境:
```
python3 -m venv .venv
```
激活虚拟环境:
```
source .venv/bin/activate
```
安装依赖项:
```
pip install -r requirements.txt
```
## requirements.txt
`requirements.txt` 文件应包含:
```
requests
termcolor
```
## 使用说明
简单执行:
```
python3 exploit_ctf.py -u http://target/cms
```
使用 wordlist 尝试破解密码:
```
python3 exploit_ctf.py -u http://target/cms --crack -w wordlist-example.txt
```
查看脚本帮助:
```
python3 exploit_ctf.py -h
```
## wordlist 示例
`wordlist-example.txt` 文件可以包含:
```
wrongpassword
admin123
dieema123
password
123456
```
## 预期输出示例
```
[+] Salt da senha encontrado: 1dac0d92e9fa6bb2
[+] Username encontrado: mitch
[+] Email encontrado: admin@admin.com
[+] Hash da senha encontrado: 0c01f4468bd75d7a84c7eb73846e8d96
[+] Senha encontrada: dieema123
```
## 破解原理解析
在 exploit 提取出密码的 salt 和 hash 之后,它可以尝试使用 wordlist 来找出明文密码。
测试的逻辑如下:
```
md5(salt + senha_candidata)
```
对于 wordlist 中的每一个密码,脚本都会计算其 hash,并将其与从数据库中提取出的 hash 进行比较。
概念示例:
```
candidate_hash = md5("1dac0d92e9fa6bb2" + "dieema123")
```
如果结果与提取出的 hash 相同,说明密码已找到。
## 关于执行时间的注意事项
Time-based SQL Injection 通常比较缓慢,因为需要通过多次请求来测试每一个字符。
此版本通过以下方式缩短了时间:
- 已知前缀。
- 用于 salt 和 hash 的十六进制字符集。
- 已知的 salt 和 hash 最大长度。
- 每个正确字符产生 1 秒的延迟。
尽管如此,实际所需时间仍可能因以下因素而异:
- 网络延迟。
- 服务器负载。
- 数据库性能。
- `TIME_DELAY` 中配置的值。
如果出现大量误报或漏报,请增加代码中 `TIME_DELAY` 的值。
## 参考
- CVE-2019-9053
- CMS Made Simple <= 2.2.9
- 技术:time-based blind SQL Injection
## 许可证
仅供教育使用。
本材料仅供学习、实验室演示和 CTF 活动之用。
标签:CISA项目, PoC, Python, 无后门, 暴力破解