- Регистрация
- 16 Ноя 2013
- Сообщения
- 26
- Лучшие ответы
- 0
- Репутация
- 0
В данном мануале я расскажу свой способ обнаружить инъекцию в моде без подробного осмотра.
Краткая предыстория: недавно на одном из серверов встал вопрос защиты мода от SQL-инъекций. Мне выпало задание найти и, если таковые есть, устранить. Решение в лоб (поиск по функции отправки запроса к базе) не подходило так как количество строк, которые надо будет проверить, превышало пару тысяч.
Исходя из описанной ситуации было принято решение написать несколько регулярных выражений для поиска "слабых" мест
Дисклеймер: данный способ НЕ может гарантировать отсутствие инъекций в коде так как писался под конкретный мод. Если вы обладаете достаточными навыками, то без проблем сможете переделать и под свой мод, а для новичков я оставил краткую инструкцию внизу темы.
Случай первый:
Форматирование запроса происходит с помощью функции mysql_format и требует явного указания соединения.
Как работает регулярное выражение: мы ищем строку в которой есть и переменная с нашим соединением, и "небезопасный" оператор %s
Случай второй:
Форматирование запроса происходит с помощью функции format и не требует явного указания соединения. Данный случай распознать с помощью регулярных выражений намного сложнее и указанный способ не может дать 100% гарантию нахождения инъекции.
Как работает регулярное выражение: мы ищем строку форматирования с "небезопасным" оператором %s и обязательно ждем на следующей строке переменную с названием нашего соединения.
Инструкция по использованию:
1. Копируем выражение, слово handle заменяем на название своей переменной с ID соединения MySQL (найти можно по ключевому слову = mysql_connect)
1.1 Производим поиск по получившемуся выражению в редакторе, который поддерживает регулярные выражения. Лично я использую PawnVSCode и NotePad++
2. Если нашлась строка, то стоит перепроверить действительно ли формируется запрос в этой строке.
3. Вы перепроверили и это оказался действительно запрос - избавляйтесь от инъекции. Инструкций по избавлению от инъекций очень много в интернете, а также на этом форуме.
3.1. Если строка не нашлась, то значит всё хорошо и в моде скорее всего нет инъекций.
Краткая предыстория: недавно на одном из серверов встал вопрос защиты мода от 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. Если строка не нашлась, то значит всё хорошо и в моде скорее всего нет инъекций.
Последнее редактирование: