Продолжаем рассматривать SQL-инъекции, и хотелось бы продемонстрировать их на другой странице веб-приложения Mutillidae.
Перейдем на страницу, которая называется «User Info». Путь до этой страницы лежит через меню слева на сайте. Выбираем «OWASP Top 10», далее «A1 — Injection», «SQLi-Extract Data», «User Info»:
Напомню, что в предыдущих примерах, мы открывали страницу авторизации, а теперь страницу «User Info». Эта страница показывает информацию, по логину и паролю. Я введу в поле «Name», имя «timcore», а в поле «Password» также «timcore». В итоге получаем вывод результатов:
Выражение, которое было выполнено, очень похоже, что и при обычной авторизации. Оно имело вид: «Select * from accounts where username = '$USERNAME' and password='$PASSWORD'».
Можем рассматривать еще один способ использования этой уязвимости. Мы ранее рассматривали примеры с использованием текстового поля POST. Исходя из механики этого метода, вся информация отправлялась из полей ввода, посредством POST.
Эти уязвимости также применимы к методу GET. Как Вы уже догадались, нам понадобится URL страницы, для эксплуатации этой уязвимости.
Перейдем в URL, и два параметра будут посвящены логину и паролю, который я вводил:
Давайте поработаем с этим URL-адресом, так как в некоторых ситуациях у нас не будет полей авторизации, и можно будет поработать с адресом.
Он имеет вид «index.php?page=user-info.php&username=timcore&password=timcore&user-info-php-submit-button=View+Account+Details»:
В общем мы попытаемся сделать инъекцию в поле «username». Отмечу, что каждый раз, когда Вы видите такие параметры, Вам просто необходимо попытаться сделать инъекцию в них. Тестируйте истинные и ложные выражения, так как мы использовали в предыдущих примерах, такие как «and 1=1», и «and 1=2».
Мы также можем использовать выражение «order by». Выражение «order by» используется для ограничения количества записей, которые будут отображены на экране. Запись в параметре «username» примет вид: «timcore“ order by 1»:
По идее, при выражении «order by 1», должна быть выбрана хотя бы одна запись.
Нужно еще добавить комментарий в виде решетки «#». Все, как и раньше:
В браузере код должен быть зашифрован, и если я хочу вставить знак «#», в URL, мне необходимо перекодировать его в символы и цифры «%23», а пробел, к примеру преобразуется в «%20».
Эту информацию я легко узнал из поисковика, с помощью онлайн декодеров. Они легко находятся в сети, так что это не составит труда.
Давайте вставим нашу запись в URL, и вставив вместо символа комментария «#», %23:
И, как видим, у нас все получилось. Даже прошел вывод всех записей, с логином «timcore». Пароль игнорируется, и инъекция сработала:
Предлагаю отредактировать наш параметр, в частности цифру 1 на 50 000 (для примера). Сайт небольшой, поэтому очень высока вероятность, что 50 000 записей просто нет. Выполним эту команду:
Как видим, произошла ошибка в сортировке, так как не существует столбца в 50 000.
В итоге, мы знаем, что база данных исполняет наши команды, а также, что существуют уязвимости к SQL-инъекциям.
На этом все. Всем хорошего дня!