🧱Base
Поиск обрамления параметра
Где я?
Это страница с дополнительным материалом для студентов, изучающих курс SQL Injection Master.
Материалы на этой странице подробно разбирают принцип вывода ошибок MySQL и объясняют как найти символ обрамления.
В материалах показываются GET запросы, PHP код и как полученные данные из параметров будут подставляться в SQL запросы. Так же для наглядности все необходимые места отмечены разными цветами, для простоты определения.
Первый пример будет разобран подробно, остальные коротко.
Поговорим об обрамлениях
Одинарные кавычки [id='1']
Для примера возьмём вот такой небольшой кусок PHP кода, в нём значение из GET параметра id заносится в PHP переменную id и после значение этой переменной отправляется в SQL запрос.
...
$id = $_GET['id'];
$query = "SELECT news FROM world_news WHERE id='$id'";
...Передадим в параметр id значение 1' с помощью GET запроса:
http://localhost/news.php?id=1'Поскольку все значения, отправленные в параметр id, не фильтруются и передаются напрямую в SQL запрос, то мы имеем возможность вызвать ошибку синтаксиса.
Запрос сломался, есть лишняя одинарная кавычка, которую мы отправили вместе с 1.
Она заняла место оригинальной кавычки и закрыла обрамление параметра, а старая кавычка никуда не делась, по этому возникает ошибка синтаксиса:
Внимательно посмотрите на сообщение об ошибке в синтаксисе SQL запроса. Там очень много кавычек и нам надо в них разобраться!
На следующем изображении та же самая ошибка, только кавычки дополнительно попарно выделены разными цветами и увеличены в размере

' ' - Одинарные кавычки, которыми MySQL выделяет проблемную часть запроса (эти информационные кавычки присутствуют в любом сообщении об ошибке);
' ' - Одинарные кавычки, которыми обрамляется параметр PHP в SQL запросе;
' - Наша одинарная кавычка, ломающая запрос.
Внимание, иногда из-за большой длинны запроса мы можем видеть только завершающие символы в ошибке, по этому в первую очередь обращаем внимание именно на них!
Разобравшись во всех кавычках мы можем сделать вывод, что одинарная кавычка ' является символом обрамления.
Но, что более важно, мы это можем проверить! Для этого нам нужно лишь добавить символы, с помощью которых в MySQL выделяются комментарии:
-- -(Два дефиса пробел и любой символ)/**(Слеш и две звездочки)#(Решётка \ Хештег)
Попробуем избавиться от прошлой ошибки с помощью комментария -- -
С помощью символов комментария мы "отсекаем" остаток оригинального SQL запроса, и, поскольку теперь количество кавычек не ломает синтаксис запроса, мы не увидим сообщение об ошибке.
Как видно выше теперь наша одинарная кавычка, переданная в параметр, является символом, закрывающим обрамление параметра! А оригинальная кавычка из запроса попадает в комментарий, не обрабатывается MySQL как символ обрамления и не вызывает ошибку синтаксиса.
Именно так и работаю SQL инъекции, благодаря этому мы можем модифицировать SQL запросы и добавлять дополнительные условия, объединения и прочие классные штуки, которые будут полезны для получения данных из БД!
Например, мы можем добавить условие OR 1, тогда наш запрос будет выглядеть вот так:
А в базу отправится вот такой запрос:
Ошибки синтаксиса не будет, поскольку мы указали верный символ обрамления и использовали символы комментария, для отсечения остатка запроса.
Но что будет, если мы укажем неверный символ обрамления. Например, отправим символ " хотя символ обрамления параметра '
Тогда в базу у нас будет отправлен следующий запрос:
Как видно из подсветки синтаксиса выше, всё что мы отправили в id стало строкой и не вызовет ни ошибку синтаксиса, ни исполнение нашей инъекции.
Двойные кавычки [id="1"]
' ' - Одинарные кавычки, которыми MySQL выделяет проблемную часть запроса (эти информационные кавычки присутствуют в любом сообщении об ошибке);
" " - Двойные кавычки, которыми обрамляется параметр PHP;
" - Наша двойная кавычка, ломающая запрос.
Работа с символами комментария аналогична примеру с обрамлением одинарной кавычкой.
Двойные кавычки в скобках [id=("1")]

' ' - Одинарные кавычки, которыми MySQL выделяет проблемную часть запроса (эти информационные кавычки присутствуют в любом сообщении об ошибке);
" ") - Двойные кавычки и закрывающая круглая скобка, которыми обрамляется параметр PHP;
( - Открывающая круглая скобка не отображается;
" - Наша Двойная кавычка, ломающая запрос.
В данном случае одной лишней двойной кавычки не хватит для закрытия параметра, нам нужно добавить закрывающую круглую скобку ).
' ' - Одинарные кавычки, которыми MySQL выделяет проблемную часть запроса (эти информационные кавычки присутствуют в любом сообщении об ошибке)
") - Двойная кавычка и закрывающая круглая скобка из оригинального запроса, которые теперь провоцируют ошибку синтаксиса
С помощью символов комментария мы отсекаем последнюю двойную кавычку и закрывающую круглую скобку ") и вместо неё в запросе теперь будет использоваться наша пара ")
Благодаря этому мы можем модифицировать SQL запрос
Без обрамления [id=1]
' ' - Одинарные кавычки, которыми MySQL выделяет проблемную часть запроса (эти информационные кавычки присутствуют в любом сообщении об ошибке)
" - Двойная кавычка, сломавшая нам запрос, но в этом случае любая кавычка или скобка сломает нам запрос
Поскольку наш параметр ничем не обрамляется, то мы можем спокойно писать нашу инъекцию сразу после значения
Одинарные кавычки в скобках [id=('1')]
Всё так же как и в "Обрамление двойными кавычками в скобках"!
Скобки [id=(1)]
Всё так же как и в "Обрамление двойными кавычками в скобках", но без двойных кавычек 😂!
Алгоритм поиска обрамления с помощью символа \ и его проверка
\ и его проверкаОтправляем символ
\и смотрим ошибку. Чтобы не путаться в количестве и типе кавычек лучше их скопировать в блокнот и там разделить пробелами.
Подставляем в параметр любое значение и найденный символ обрамления (должны получить ошибку, если символ обрамления найден верно, если символ обрамления найден неверно, то ошибку мы не получим).
Значение, сравниваемое с id, обрамляется одинарными кавычками и если мы передадим лишнюю одинарную кавычку, то синтаксис запроса будет неверным.
Теперь подставляем в параметр любое значение, найденный символ обрамления и символы комментария.
Благодаря символам комментария -- - наша кавычка ' заменяет оригинальную , а оригинальная ' попадает в комментарий и не будет учитываться в запросе. В таком случае мы не получим уведомление об ошибке.
Этим мы подтвердили, что символ обрамления выбран правильный и можно начинать развивать инъекцию дальше.
Что будет, если мы подберём неправильный символ обрамления?
Это зависит от символов обрамления:
Мы не увидим сообщения об ошибке, поскольку наша инъекция просто будет воспринята как строка;
Мы увидим сообщения об ошибке синтаксиса.
Варианты обрамления параметров в запросах
Ниже перечислены все возможные варианты обрамления параметров.
🆎 Варианты обрамления строкового параметра 🆎
select column_name from table_name WHERE id='1'select column_name from table_name WHERE id="1"select column_name from table_name WHERE id=('1')select column_name from table_name WHERE id=("1")
🔢 Варианты обрамления числового параметра 🔢
select column_name from table_name WHERE id=1select column_name from table_name WHERE id='1'select column_name from table_name WHERE id="1"select column_name from table_name WHERE id=(1)select column_name from table_name WHERE id=('1')select column_name from table_name WHERE id=("1")
Поскольку они пересекаются, то за основной список можем взять "Варианты оформления числового параметра" и дальше работать со следующими символами:
[без обрамления]'")')")
Сохраните себе этот список и возвращайтесь к нему по необходимости!
ВНИМАНИЕ! Других символов обрамления не бывает, учитывайте это во время работы над заданиями!
Заключение
Всем спасибо за внимание, надеюсь этот материал помог вам структурировать полученные знания из методички!
Кстати, если кто-то хочет потренироваться на локальном стенде, то я разместил архив с php страницей и экспортом тестовой БД.
Просто следуйте инструкции из README.TXT для установки стенда на вашей машине.
На странице можно выбирать тип обрамления, видеть наши символы и инъекции отправляемые в параметр и после передаваемые в SQL запрос, а так же видеть подсветку синтаксиса SQL запроса, для лучшего визуального понимания. [Скачать]
Если кто-то не доверяет файлам из интернета, то всегда можно проверить код php файла, он предельно простой и в нём нет никаких скрытых закладок!
Всем успехов! BearSec
Last updated