Помню, как-то начальник запостил инфу в чат аналитиков, что на проде нашли инъекцию. Предложил на тестовом стенде пощупать уязвимость. Через несколько месяцев запостил еще раз. Детали я уже подзабыл, но сути это не меняет: разработчики иной раз забивают на DevSecOps. Аналитиков же могут заставить подключиться к разбору продовых инцидентов. Ha-ha, classic 🚬.
В чем суть SQL-инъекции? В незащищённые формы ввода, URL-параметры или поля поиска прописывается частичка SQL-кода. Она передается на сервак и встраивается в основной SQL-код, меняя его логику. Мошенник получает возможность взаимодействовать с базой данных.
Классический пример. Допустим, в админке отрабатывает запрос к базе:
SELECT * FROM users WHERE login = '{логин_пользователя}' AND password = '{пароль}';Пройдоха передает в логин что-то вроде:
' OR 1=1; --
В пароль можно вообще ничего не передавать, т.к. он закомментируется. Или передать что-то номинальное. Давайте, передадим qwerty. На серваке отработает запрос:
SELECT * FROM users WHERE login = '' OR 1=1; -- AND password = 'qwerty';
Смысл в том, что условие 1=1 является истиной, а дальнейший код закомментирован, а значит взломщику нет нужды вводить правильные credentials.
О трюке с закрытием кавычки и передаче истинного условия
OR TRUE; --
можно прочитать, например, в документации Python:
# Never do this -- insecure!
symbol = input()
# ' OR TRUE; --
sql = "SELECT * FROM stocks WHERE symbol = '%s'" % symbol
print(sql)
# SELECT * FROM stocks WHERE symbol = '' OR TRUE; --'
cur.execute(sql)
На практике же, взломщику неизвестно каким образом формируется запрос и какими данными он оперирует. Поэтому SQL-инъекции превращаются в искусство, требующее набивки руки и насмотренности. Для оптимизации трудозатрат существуют сканеры. Самая известная, это SQLMap. Пока сам еще не юзал.
Инъекцией можно вытворять самую разнообразную логику. Например:
'; DROP TABLE users; --
И получим:
SELECT * FROM users WHERE login= ''; DROP TABLE users; --' AND password = '';
То есть: пытаемся отгрузить данные пользователя, а потом дропаем таблицу.
Есть, как минимум, 2 способа попытаться определить кол-во полей в таблице:
' order by 10 --
' group by 10 --
Есть слепые инъекции / blind injections направленные на получение косвенных сведений. Классический пример, это задержка производительности, показывающая что бэкенд, как минимум, уязвим:
' OR IF(1=1, SLEEP(5), 0) --
А по этой ссылке описаны атаки с регулярными выражениями. И так далее, и так далее...
✔️Потренироваться в инъекциях можно на сайте:
https://www.alexbers.com/sql/1.php
✔️ Эти же задания скопированы на ХакерДом, с приятным глазу интерфейсом:
https://sql.training.hackerdom.ru/
✔️Почитать как решать задачи можно в статье:
https://habr.com/ru/articles/253885/
Я сумел самостоятельно решить только первые 5 из 10 задач. Дальше подсматривал. На 6-й задаче я все же сумел сам догадаться, что если кавычки запрещены, то надо использовать другой формат слова god. А вот каким образом - не допер. Надо было вызвать функцию CHAR() передав в нее ASCII-коды букв слова god:
login = CHAR(103, 111, 100)
Либо перевести god в кодировку HEX. Получится 676F64. Только не забывайте подставлять префикс 0x, чтобы не скормить базе просто буквоцифры:
login = 0x676F64
А вы сталкивались с SQL-инъекциями? Сколько задач на сайте смогли сами решить? 😉
🐧 Понравился пост? Подписывайся, чтобы не пропустить следующий.
Артем Лещев