
Учебный PoC на Python 3 для CVE-2019-9053, time-based blind SQL-инъекции в CMS Made Simple <= 2.2.9. Эта версия адаптирована для использования в CTF/лаборатории: предварительно настроенные префиксы сокращают время извлечения данных, а пояснительные сообщения приведены на португальском языке.
Учебный PoC на Python 3 для CVE-2019-9053, уязвимости time-based blind SQL Injection в CMS Made Simple <= 2.2.9.
Эта версия была изменена для использования в CTF/лабораторных условиях. Она содержит предварительно настроенные префиксы для сокращения времени извлечения и поясняющие сообщения на португальском языке, чтобы помочь студентам понять работу эксплойта.
Этот проект предназначен исключительно для образовательных целей, контролируемых лабораторий и CTF-сред.
Не используйте этот код против систем третьих лиц без явного разрешения.
Автор этого репозитория не несёт ответственности за неправомерное использование этого материала.
CVE-2019-9053 затрагивает старые версии CMS Made Simple, позволяя выполнять неаутентифицированную SQL-инъекцию через параметр m1_idlist в конечной точке:
/moduleinterface.php?mact=News,m1_,default,0
Поскольку ответ SQL-запроса не отображается напрямую на странице, эксплойт использует метод time-based blind SQL Injection.
Эксплойт отправляет payloads, которые заставляют базу данных выполнить sleep(1), когда условие истинно.
Концептуальный пример:
AND (
SELECT sleep(1)
FROM cms_users
WHERE password LIKE '0c01%'
)
Если сервер отвечает с задержкой, скрипт понимает, что проверяемый префикс верен.
Таким образом, он восстанавливает чувствительные данные посимвольно, например:
В этой CTF-версии в код уже включены некоторые префиксы, чтобы сократить время, необходимое для выполнения задания.
SQL-инъекция возникает, когда приложение вставляет управляемые пользователем данные в SQL-запрос без надлежащей обработки.
В данном случае инъекция является 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.
Повторяя этот процесс посимвольно, эксплойт может восстановить значения из базы данных, даже не видя их напрямую на странице.
Соль (salt) — это дополнительное значение, используемое вместе с паролем перед созданием хеша.
В этом задании CMS Made Simple использует логику, аналогичную:
md5(salt + password)
Например:
salt = 1dac0d92e9fa6bb2
password = exemplo123
Хеш вычислялся бы на основе:
1dac0d92e9fa6bb2exemplo123
Соль служит для затруднения атак с предвычисленными таблицами и для того, чтобы одинаковые пароли могли давать разные хеши в разных контекстах.
Тем не менее md5(salt + password) — это старый и слабый способ хранения паролей. Современные системы должны использовать специализированные алгоритмы для паролей, такие как:
Эта версия адаптирована для удобства использования в практическом задании.
Основные изменения:
Значения, используемые в задании:
Salt completo: 1dac0d92e9fa6bb2
Username: mitch
Email: [email protected]
Hash completo: 0c01f4468bd75d7a84c7eb73846e8d96
Префиксы, настроенные в эксплойте:
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
Клонируйте репозиторий:
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
Запуск с попыткой подбора пароля с помощью словаря (wordlist):
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
[+] Salt da senha encontrado: 1dac0d92e9fa6bb2
[+] Username encontrado: mitch
[+] Email encontrado: [email protected]
[+] Hash da senha encontrado: 0c01f4468bd75d7a84c7eb73846e8d96
[+] Senha encontrada: dieema123
После того как эксплойт извлекает соль и хеш пароля, он может попытаться найти пароль в открытом виде с помощью словаря (wordlist).
Проверяемая логика:
md5(salt + senha_candidata)
Для каждого пароля из словаря скрипт вычисляет хеш и сравнивает его с хешем, извлечённым из базы данных.
Концептуальный пример:
candidate_hash = md5("1dac0d92e9fa6bb2" + "dieema123")
Если результат совпадает с извлечённым хешем, пароль найден.
Time-based SQL-инъекция обычно медленная, потому что каждый символ приходится проверять множеством запросов.
Эта версия сокращает время благодаря:
Тем не менее время может варьироваться в зависимости от:
TIME_DELAY.Если наблюдается много ложноположительных или ложноотрицательных результатов, увеличьте значение TIME_DELAY в коде.
Версия Python 3, модифицированная для CTF, — Derick G. Andrighetti.
Основано на старом публичном PoC на Python 2, первоначально опубликованном Daniele Scanu из Certimeter Group.
Использование в образовательных целях.
Этот материал создан для учебных целей, лабораторных демонстраций и CTF-заданий.