Введение в практическую безопасность (2019)/HTTP, инструменты & SQL injection: различия между версиями

Материал из SecSem Wiki
Перейти к навигации Перейти к поиску
(SQL injection)
(SQL injection)
Строка 27: Строка 27:
 
[[Файл:Sql-id.png|520px]]
 
[[Файл:Sql-id.png|520px]]
  
Возможность передать такое значение параметра HTTP-запроса, которое подставится в текст SQL-запроса и при подстановке изменит смысл этого запроса называется '''SQL injection''' ([https://www.owasp.org/index.php/SQL_Injection OWASP]). Хорошую статью про SQL injection можно [https://rdot.org/forum/showthread.php?s=f4292383c9896b773bd98d827eb9411f&t=124 найти тут] и [http://pentestmonkey.net/cheat-sheet/sql-injection/mysql-sql-injection-cheat-sheet еще тут].  
+
Возможность передать такое значение параметра HTTP-запроса, которое подставится в текст SQL-запроса и при подстановке изменит смысл этого запроса называется '''SQL injection''' ([https://www.owasp.org/index.php/SQL_Injection OWASP]). Хорошую статью про SQL injection можно [https://rdot.org/forum/showthread.php?s=f4292383c9896b773bd98d827eb9411f&t=124 найти тут] и [http://pentestmonkey.net/cheat-sheet/sql-injection/mysql-sql-injection-cheat-sheet еще тут].
 +
 
 +
Попробовать эксплуатировать SQL injection можно на этих уязвимых приложениях:
 +
* http://sql1.stands.course.secsem.ru/
 +
* http://sql2.stands.course.secsem.ru/
  
 
Фактически, SQLi это один из представителей класса уязвимостей '''injection''', которые получаются, если в какие-то управляющие команды подставляются параметры-данные от пользователя и эти данные могут выйти из контекста, куда подставляются, перестав быть просто данными, и поменять смысл команды.
 
Фактически, SQLi это один из представителей класса уязвимостей '''injection''', которые получаются, если в какие-то управляющие команды подставляются параметры-данные от пользователя и эти данные могут выйти из контекста, куда подставляются, перестав быть просто данными, и поменять смысл команды.

Версия 01:02, 25 февраля 2019

HTTP

Клиенты (например, веб-браузеры) взаимодействуют с веб-приложениями по протоколу HTTP (википедия, стандарт HTTP 1.1: RFC 2616, RFC 7230, RFC 7231). Он работает поверх TCP, стандартный TCP-порт для HTTP без SSL (шифрования) это порт 80, а для HTTPS (HTTP поверх SSL, т. е. с шифрованием) это порт 443. Протокол состоит из запросов (которые клиент отправляет серверу) и ответов (которые сервер присылает в ответ). Протокол HTTP версии 1.1 (наиболее используемой в данный момент) и более ранних - текстовый, то есть сообщения этого протокола человекочитаемые. К примеру, вот запрос, который сделает браузер при переходе по URL http://sql1.stands.course.secsem.ru/users:
Http-req-annot.png
Ответ сервера на него:
Http-res-annot.png
Ещё пример, запрос, который сделает браузер при попытке (неудачной) залогиниться на сайте vk.com c почтой "admin@adminmail.ru" и паролем "adminpassword":
Http-req-post-annot.png
Ответ сервера на этот запрос
Http-res-post-annot.png

Инструменты

  1. Для анализа HTTP-взаимодействия между клиентом и сервером, а также для вмешательства в него удобен Burp Suite. Он может работать как HTTP-proxy, то есть получать от клиента запрос и пересылать его серверу, получать ответ сервера и передавать его клиенту. При этом Burp может показывать запросы и ответы пользователю, задерживать и изменять их. Кроме этого, он может формировать и отправлять новые HTTP-запросы сам ("вручную"). Здесь написано как его скачать и начать использовать.
  2. Более простые инструменты, позволяющие отправлять HTTP-запросы веб-приложению и получать ответы - netcat и curl.
    • Netcat (man) позволяет установить tcp-соединение, после чего отправляет на другой конец всё что подано ему на стандартный ввод и печатает на стандартный вывод всё, что получил. Он позволяет буквально "руками" набрать и отправить HTTP-запрос. Вот как можно отправить запрос, соответствующий переходу по URL http://mail.ru:
      Nc-http.png
      То же самое, но с флагом "-v" (который говорит Netcat выдавать более подробную диагностику, в т. ч. написать об успешности установления TCP-соединения и парой дополнительных HTTP-заголовков (заголовок "Connection: close" говорит серверу что после этого запроса TCP-соединение будет закрыто, новых запросов в нём не будет): Nc-http2.png
    • curl (man) позволяет очень просто делать HTTP-запросы из консоли.
      Curl example org.png

SQL injection

Веб-приложения нередко используют SQL-базы данных, т. е. базы данных, взаимодействие с которыми осуществляется через запросы на языке SQL (википедия, курс "Основы современных баз данных" С.Д. Кузнецова. Поиграться с SQL можно просто в SQL Fiddle или с помощью sqlite3. Пример SQL-запросов и ответов на них:
Sql1-annotated.png
Sql2-annotated.png
Веб-приложение формирует и отправляет базе SQL-запросы, которые могут зависеть от параметров, пришедших от клиента (взятых из HTTP-запроса). SQL-запросы текстовые и простой способ сделать запрос, зависящий от параметра - просто подставить этот параметр в текст запроса. Пример кода (на языке Python), подставляющего параметр из HTTP-запроса в SQL-запрос к базе: Sqli-code.png Здесь "request.args.get('login')" считывает значение параметра "login" query string запроса. Вот какой вид примет запрос, если параметр login будет иметь значение "testuser".

Sql-req.png Значение "testuser" подставилось в строковый литерал в одинарных кавычках. Говорят, что значение попало в контекст строкового литерала. После такой подстановки может оказаться, что смысл SQL-запроса изменился и данные, подставленые в запрос стали не просто значением параметра запроса (скажем, числовым или стокововым литералом), а какими-то еще конструкциями языка SQL. Вот какой запрос будет сформирован, если параметр "login" будет иметь значение ' or 1=1 --:

Sqli-annot.png

В результате выражение в WHERE-части приняло вид login='' or 1=1, оно будет истинным для любой строки таблицы, в результате чего в ответ на этот запрос будут возвращены все строки таблицы. Так же можно изменить смысл запроса и передав специфическое значение параметра id для этого кода (для этого даже не придётся добавлять в значение параметра кавычку):

Sql-id.png

Возможность передать такое значение параметра HTTP-запроса, которое подставится в текст SQL-запроса и при подстановке изменит смысл этого запроса называется SQL injection (OWASP). Хорошую статью про SQL injection можно найти тут и еще тут.

Попробовать эксплуатировать SQL injection можно на этих уязвимых приложениях:

Фактически, SQLi это один из представителей класса уязвимостей injection, которые получаются, если в какие-то управляющие команды подставляются параметры-данные от пользователя и эти данные могут выйти из контекста, куда подставляются, перестав быть просто данными, и поменять смысл команды.