
CMS Made Simple CVE-2019-9053 Exploit (Python 3)
A Python 3 port of the time-based blind SQL injection exploit targeting CMS Made Simple <= 2.2.9.
Original exploit by Daniele Scanu @ Certimeter Group.
| Field | Detail |
|---|---|
| CVE | CVE-2019-9053 |
| Affected Software | CMS Made Simple <= 2.2.9 |
| Vulnerability Type | Unauthenticated Time-Based Blind SQL Injection |
| Attack Vector | Network (no authentication required) |
| Parameter | m1_idlist in the News module |
The News module fails to sanitize the m1_idlist GET parameter, allowing an unauthenticated attacker to extract sensitive data from the database character by character using time delays.
pip install requests termcolor
python3 CVE-2019-9053_py3.py -u http://target/cms
python3 CVE-2019-9053_py3.py -u http://target/cms --crack -w /path/to/wordlist.txt
python3 CVE-2019-9053_py3.py --help
python3 CVE-2019-9053_py3.py -u http://10.49.164.146/simple/ --crack -w /usr/share/wordlists/rockyou.txt
Expected output:
[+] Salt for password found: 1234abcd
[+] Username found: admin
[+] Email found: [email protected]
[+] Password found: 0c01f4468bd75d7a84c7eb73846e8d96
[+] Password cracked: password123
cms_siteprefs table for the sitemask value (the password salt)user_id = 1 from cms_usersuser_id = 1 from cms_usersuser_id = 1 from cms_usersMD5(salt + wordlist_entry) for each line and compares against the dumped hashThe injection uses SELECT SLEEP(N) to infer each character — if the response is delayed, the guessed character is correct.
Tip: If the script is slow or unreliable, increase the
TIMEvariable inside the script to account for network latency.
This project is for educational use only. Refer to the original exploit's licensing terms on Exploit-DB.
| Flag | Description |
|---|
-u, --url | Base URL of the target CMS Made Simple installation |
-w, --wordlist | Path to a wordlist file for password cracking |
-c, --crack | Enable password cracking mode (requires -w) |
| Change | Detail |
|---|
print statements | Converted to print() functions |
optparse | Replaced with argparse (optparse is deprecated in Python 3) |
hashlib.md5() | Input now encoded to bytes via .encode('utf-8') |
| File reading | Replaced .readlines() with a with block and .strip() |