Введение в практическую безопасность (2019)/HTTP, инструменты & SQL injection: различия между версиями
Asterite (обсуждение | вклад) (→SQL injection) |
Asterite (обсуждение | вклад) (→Инструменты) |
||
Строка 7: | Строка 7: | ||
# Для анализа HTTP-взаимодействия между клиентом и сервером, а также для вмешательства в него удобен '''Burp Suite'''. Он может работать как HTTP-proxy, то есть получать от клиента запрос и пересылать его серверу, получать ответ сервера и передавать его клиенту. При этом Burp может показывать запросы и ответы пользователю, задерживать и изменять их. Кроме этого, он может формировать и отправлять новые HTTP-запросы сам ("вручную"). [http://demo.secsem.ru/workshop/burp Здесь написано как его скачать и начать использовать]. | # Для анализа HTTP-взаимодействия между клиентом и сервером, а также для вмешательства в него удобен '''Burp Suite'''. Он может работать как HTTP-proxy, то есть получать от клиента запрос и пересылать его серверу, получать ответ сервера и передавать его клиенту. При этом Burp может показывать запросы и ответы пользователю, задерживать и изменять их. Кроме этого, он может формировать и отправлять новые HTTP-запросы сам ("вручную"). [http://demo.secsem.ru/workshop/burp Здесь написано как его скачать и начать использовать]. | ||
# Более простые инструменты, позволяющие отправлять HTTP-запросы веб-приложению и получать ответы - '''netcat''' и '''curl'''. | # Более простые инструменты, позволяющие отправлять HTTP-запросы веб-приложению и получать ответы - '''netcat''' и '''curl'''. | ||
− | #* '''Netcat''' ([https://www.opennet.ru/man.shtml?topic=netcat man]) позволяет установить tcp-соединение, после чего отправляет на другой конец всё что подано ему на стандартный ввод и печатает на стандартный вывод всё, что получил. Он позволяет буквально "руками" набрать и отправить HTTP-запрос. Вот как можно отправить запрос, соответствующий переходу по URL http://mail.ru< | + | #* '''Netcat''' ([https://www.opennet.ru/man.shtml?topic=netcat man]) позволяет установить tcp-соединение, после чего отправляет на другой конец всё что подано ему на стандартный ввод и печатает на стандартный вывод всё, что получил. Он позволяет буквально "руками" набрать и отправить HTTP-запрос. Вот как можно отправить запрос, соответствующий переходу по URL http://mail.ru: |
+ | <pre>$ nc mail.ru 80 | ||
+ | GET / HTTP/1.1 | ||
+ | Host: mail.ru | ||
+ | |||
+ | HTTP/1.1 301 Moved Permanently | ||
+ | Server: nginx/1.14.1 | ||
+ | Date: Sun, 24 Feb 2019 20:08:08 GMT | ||
+ | Content-Type: text/html | ||
+ | Content-Length: 185 | ||
+ | Connection: keep-alive | ||
+ | Location: https://mail.ru | ||
+ | X-XSS-Protection: 1; mode=block; report=https://cspreport.mail.ru/xxssprotection | ||
+ | X-Content-Type-Options: nosniff | ||
+ | |||
+ | <html> | ||
+ | <head><title>301 Moved Permanently</title></head> | ||
+ | <body bgcolor="white"> | ||
+ | <center><h1>301 Moved Permanently</h1></center> | ||
+ | <hr><center>nginx/1.14.1</center> | ||
+ | </body> | ||
+ | </html> | ||
+ | ^C</pre> | ||
+ | То же самое, но с флагом "-v" (который говорит Netcat выдавать более подробную диагностику, в т. ч. написать об успешности установления TCP-соединения и парой дополнительных HTTP-заголовков (заголовок "Connection: close" говорит серверу что после этого запроса TCP-соединение будет закрыто, новых запросов в нём не будет): [[Файл:Nc-http2.png|800px]]<br> | ||
#* '''curl''' ([https://curl.haxx.se/docs/manpage.html man]) позволяет очень просто делать HTTP-запросы из консоли.<br>[[Файл:Curl example org.png|800px]] | #* '''curl''' ([https://curl.haxx.se/docs/manpage.html man]) позволяет очень просто делать HTTP-запросы из консоли.<br>[[Файл:Curl example org.png|800px]] | ||
Версия 23:56, 24 февраля 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:
Ответ сервера на него:
Ещё пример, запрос, который сделает браузер при попытке (неудачной) залогиниться на сайте vk.com c почтой "admin@adminmail.ru" и паролем "adminpassword":
Ответ сервера на этот запрос
Инструменты
- Для анализа HTTP-взаимодействия между клиентом и сервером, а также для вмешательства в него удобен Burp Suite. Он может работать как HTTP-proxy, то есть получать от клиента запрос и пересылать его серверу, получать ответ сервера и передавать его клиенту. При этом Burp может показывать запросы и ответы пользователю, задерживать и изменять их. Кроме этого, он может формировать и отправлять новые HTTP-запросы сам ("вручную"). Здесь написано как его скачать и начать использовать.
- Более простые инструменты, позволяющие отправлять HTTP-запросы веб-приложению и получать ответы - netcat и curl.
- Netcat (man) позволяет установить tcp-соединение, после чего отправляет на другой конец всё что подано ему на стандартный ввод и печатает на стандартный вывод всё, что получил. Он позволяет буквально "руками" набрать и отправить HTTP-запрос. Вот как можно отправить запрос, соответствующий переходу по URL http://mail.ru:
$ nc mail.ru 80 GET / HTTP/1.1 Host: mail.ru HTTP/1.1 301 Moved Permanently Server: nginx/1.14.1 Date: Sun, 24 Feb 2019 20:08:08 GMT Content-Type: text/html Content-Length: 185 Connection: keep-alive Location: https://mail.ru X-XSS-Protection: 1; mode=block; report=https://cspreport.mail.ru/xxssprotection X-Content-Type-Options: nosniff <html> <head><title>301 Moved Permanently</title></head> <body bgcolor="white"> <center><h1>301 Moved Permanently</h1></center> <hr><center>nginx/1.14.1</center> </body> </html> ^C
То же самое, но с флагом "-v" (который говорит Netcat выдавать более подробную диагностику, в т. ч. написать об успешности установления TCP-соединения и парой дополнительных HTTP-заголовков (заголовок "Connection: close" говорит серверу что после этого запроса TCP-соединение будет закрыто, новых запросов в нём не будет):
- curl (man) позволяет очень просто делать HTTP-запросы из консоли.
- curl (man) позволяет очень просто делать HTTP-запросы из консоли.
SQL injection
Веб-приложения нередко используют SQL-базы данных, т. е. базы данных, взаимодействие с которыми осуществляется через запросы на языке SQL (википедия, курс "Основы современных баз данных" С.Д. Кузнецова. Поиграться с SQL можно просто в SQL Fiddle или с помощью sqlite3. Пример SQL-запросов и ответов на них:
Веб-приложение формирует и отправляет базе SQL-запросы, которые могут зависеть от параметров, пришедших от клиента (взятых из HTTP-запроса). SQL-запросы текстовые и простой способ сделать запрос, зависящий от параметра - просто подставить этот параметр в текст запроса.
Пример кода (на языке Python), подставляющего параметр из HTTP-запроса в SQL-запрос к базе:
Здесь "request.args.get('login')" считывает значение параметра "login" query string запроса. Вот какой вид примет запрос, если параметр login будет иметь значение "testuser".
Значение "testuser" подставилось в строковый литерал в одинарных кавычках. Говорят, что значение попало в контекст строкового литерала. К примеру, вот какой запрос будет сформирован, если параметр "login" будет иметь значение ' or 1=1 --
.
После такой подстановки может оказаться, что смысл SQL-запроса изменился и данные, подставленые в запрос стали не просто значением параметра запроса (скажем, числовым или стокововым литералом), а какими-то еще конструкциями языка SQL. Возможность передать такое значение параметра HTTP-запроса, которое подставится в текст SQL-запроса и при подстановке изменит смысл этого запроса называется SQL injection. Фактически, это один из представителей класса уязвимостей injection, которые получаются, если в какие-то управляющие команды подставляются параметры-данные от пользователя и эти данные могут выйти из контекста, куда подставляются, перестав быть просто данными и поменять смысл команды.