Доступ к готовым решениям

Переход в группу "Пользователь"

300.00
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

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

Welaurs

Начинающий
Пользователь
Регистрация
16 Ноя 2013
Сообщения
26
Лучшие ответы
0
Репутация
0
В данном мануале я расскажу свой способ обнаружить инъекцию в моде без подробного осмотра.

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

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

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

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

Как работает регулярное выражение: мы ищем строку в которой есть и переменная с нашим соединением, и "небезопасный" оператор %s
PHP:
// выражение
(handle).+(%s)+.+
// "слабый" код
mysql_format(handle, query, sizeof query, "UPDATE `accounts` SET `phone` = '%s' WHERE `id` = %i", newPhone, PlayerInfo[playerid][pID]);
Случай второй:
Форматирование запроса происходит с помощью функции format и не требует явного указания соединения. Данный случай распознать с помощью регулярных выражений намного сложнее и указанный способ не может дать 100% гарантию нахождения инъекции.

Как работает регулярное выражение: мы ищем строку форматирования с "небезопасным" оператором %s и обязательно ждем на следующей строке переменную с названием нашего соединения.
PHP:
// выражение
.+(%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. Если строка не нашлась, то значит всё хорошо и в моде скорее всего нет инъекций.
 
Последнее редактирование:
Сверху Снизу