08.01.2019

[Мануал] Поиск SQL-инъекции с помощью регулярных выражений

Нажмите на изображение для просмотра в полном размере
[Мануал] Поиск SQL-инъекции с помощью регулярных выражений

Автор:Welaurs.

Взято из pawno-info.


Поиск SQL-инъекции с помощью регулярных выражений


В данном мануале я расскажу свой способ обнаружить инъекцию в моде без подробного осмотра. 

Краткая предыстория: недавно на одном из серверов встал вопрос защиты мода от SQL-инъекций. Мне выпало задание найти и, если таковые есть, устранить. Решение в лоб (поиск по функции отправки запроса к базе) не подходило так как количество строк, которые надо будет проверить, превышало пару тысяч.

Исходя из описанной ситуации было принято решение написать несколько регулярных выражений для поиска "слабых" мест

Дисклеймер: данный способ НЕ может гарантировать отсутствие инъекций в коде так как писался под конкретный мод. Если вы обладаете достаточными навыками, то без проблем сможете переделать и под свой мод, а для новичков я оставил краткую инструкцию внизу темы.

Случай первый:
Форматирование запроса происходит с помощью функции mysql_format и требует явного указания соединения.

Как работает регулярное выражение: мы ищем строку в которой есть и переменная с нашим соединением, и "небезопасный" оператор %s

код:


// выражение
(handle).+(%s)+.+
// "слабый" код
mysql_format(handle, query, sizeof query, 

"UPDATE `accounts` SET `phone` = '%s' WHERE `id` = %i", newPhone, PlayerInfo[playerid][pID]);


Случай второй:
Форматирование запроса происходит с помощью функции format и не требует явного указания соединения. Данный случай распознать с помощью регулярных выражений намного сложнее и указанный способ не может дать 100% гарантию нахождения инъекции.

Как работает регулярное выражение: мы ищем строку форматирования с "небезопасным" оператором %s и обязательно ждем на следующей строке переменную с названием нашего соединения.

код:


// выражение
.+(%s).+\n.+(query)+.+(handle).+
// "слабый" код
format(query, sizeof query, 

"UPDATE `accounts` SET `phone` = '%s' WHERE `id` = %i", newPhone, PlayerInfo[playerid][pID]);
mysql_query(handle, query); 


Инструкция по использованию:
1. Копируем выражение, слово handle заменяем на название своей переменной с ID соединения MySQL (найти можно по ключевому слову = mysql_connect)
1.1 Производим поиск по получившемуся выражению в редакторе, который поддерживает регулярные выражения. Лично я использую PawnVSCode и NotePad++
2. Если нашлась строка, то стоит перепроверить действительно ли формируется запрос в этой строке.
3. Вы перепроверили и это оказался действительно запрос - избавляйтесь от инъекции. Инструкций по избавлению от инъекций очень много в интернете, а также на этом форуме.
3.1. Если строка не нашлась, то значит всё хорошо и в моде скорее всего нет инъекций.              

Понравилось:
Категория: Статьи San Andreas Multiplayer Просмотров: 1194 Комментариев: 0
К публикации нет комментариев, но Вы можете стать первым, оставив свой комментарий!
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]