
PoC didático em Python 3 para a CVE-2019-9053, uma SQL Injection time-based blind no CMS Made Simple <= 2.2.9. Esta versão foi adaptada para uso em CTF/laboratório, com prefixos pré-configurados para reduzir o tempo de extração e mensagens explicativas em português.
用于CVE-2019-9053的Python 3教学PoC,这是CMS Made Simple <= 2.2.9中的一个基于时间的盲SQL注入漏洞。
此版本已修改为用于CTF/实验室环境。它包含预配置的前缀以减少提取时间,以及葡萄牙语的解释性信息,帮助学生理解该漏洞利用的工作原理。
本项目仅用于教育目的、受控实验室及CTF环境。
未经明确授权,请勿将此代码用于第三方系统。
本仓库的作者不对该材料的任何滥用行为负责。
CVE-2019-9053影响CMS Made Simple的旧版本,允许通过端点中的m1_idlist参数进行未认证的SQL注入:
/moduleinterface.php?mact=News,m1_,default,0
由于SQL查询的结果不会直接显示在页面上,该漏洞利用了一种称为基于时间的盲SQL注入的技术。
该漏洞利用发送有效载荷,当条件为真时,使数据库执行sleep(1)。
概念示例:
AND (
SELECT sleep(1)
FROM cms_users
WHERE password LIKE '0c01%'
)
如果服务器响应延迟,脚本认为测试的前缀是正确的。
这样,它逐字符地重建敏感信息,例如:
在此CTF版本中,代码中已包含某些前缀以减少活动所需的时间。
当应用程序将用户控制的数据未经适当处理插入SQL查询时,就会发生SQL注入。
在这种情况下,注入是盲的,因为查询结果不会直接出现在HTTP响应中。
它是基于时间的,因为攻击者使用服务器的响应时间作为响应通道。如果测试的条件为真,数据库执行sleep()延迟;如果为假,则正常响应。
简化示例:
漏洞利用提出的问题:
"密码哈希是否以0c01开头?"
如果是:
数据库执行sleep(1),响应延迟。
如果否:
响应没有明显延迟。
通过逐字符重复此过程,漏洞利用程序可以在不直接在页面上看到的情况下重建数据库中的值。
盐值是在生成哈希之前与密码一起使用的额外值。
在此挑战中,CMS Made Simple使用类似的逻辑:
md5(salt + password)
例如:
salt = 1dac0d92e9fa6bb2
password = exemplo123
哈希会根据以下内容计算:
1dac0d92e9fa6bb2exemplo123
盐值用于抵御预计算表攻击,并使相同的密码在不同上下文中生成不同的哈希。
尽管如此,md5(salt + password)是一种过时且薄弱的密码存储方式。现代系统应使用专门的密码算法,例如:
此版本已进行适配以方便在实践活动中使用。
主要更改:
挑战中使用的值:
完整盐值: 1dac0d92e9fa6bb2
用户名: mitch
电子邮件: [email protected]
完整哈希: 0c01f4468bd75d7a84c7eb73846e8d96
漏洞利用中配置的前缀:
盐值前缀: 1dac0d92
用户名前缀: mit
电子邮件前缀: admin@
哈希前缀: 0c01f446
这些前缀不会移除攻击逻辑。它们仅减少实验室活动所需的时间。
poc-CVE-2019-9053/
├── exploit_ctf.py
├── requirements.txt
├── README.md
├── wordlist-example.txt
└── .gitignore
克隆仓库:
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文件应包含:
requests
termcolor
简单执行:
python3 exploit_ctf.py -u http://target/cms
使用字典尝试密码破解的执行:
python3 exploit_ctf.py -u http://target/cms --crack -w wordlist-example.txt
查看脚本帮助:
python3 exploit_ctf.py -h
wordlist-example.txt文件可包含:
wrongpassword
admin123
dieema123
password
123456
[+] 密码盐值已找到: 1dac0d92e9fa6bb2
[+] 用户名已找到: mitch
[+] 电子邮件已找到: [email protected]
[+] 密码哈希已找到: 0c01f4468bd75d7a84c7eb73846e8d96
[+] 密码已找到: dieema123
在漏洞利用提取了盐值和密码哈希后,它可以尝试使用字典找出明文密码。
测试的逻辑是:
md5(salt + 候选密码)
对于字典中的每个密码,脚本计算哈希并与从数据库中提取的哈希进行比较。
概念示例:
candidate_hash = md5("1dac0d92e9fa6bb2" + "dieema123")
如果结果与提取的哈希相等,则找到了密码。
基于时间的SQL注入通常很慢,因为每个字符都需要通过多次请求进行测试。
此版本通过以下方式减少时间:
即便如此,时间可能因以下因素而变化:
TIME_DELAY中配置的值。如果出现大量误报或漏报,请增加代码中TIME_DELAY的值。
由Derick G. Andrighetti修改为CTF的Python 3版本。
基于Certimeter Group的Daniele Scanu最初发布的旧版Python 2公共PoC。
教育用途。
本材料是为学习、实验室演示和CTF活动而制作的。