SQL-инъекции, связанные с мультибайтовыми кодировками и addslashes

Недавно на milw0rm’е был опубликован эксплоит для популярного форумного движка  Simple  Machines  Forum  версии 1.1.4, являющейся довольно распространенной на просторах интернета. Уязвимость связана с реализацией SQL-инъекции, основанной на особенностях мультибайтовых кодировок, которые позволяют обойти экранирование опасных символов с помощью функции addslashes().

Итак, уязвимость возможна благодаря тому, что при установке SMF переменная $db_character_set не записываются в конфигурационный файл, если пользователь оставил кодировку соединения с базой данных по умолчанию (в SMF это UTF-8). При включенной опции register_globals злоумышленник может назначить этой переменной любое значение, состоящее из буквенно-цифровых символов. Таким образом, вместо стандартной кодировки можно назначить любую другую, включая определенные мультибайтовые кодировки, позволяющие обойти фильтрацию входящих данных посредством addslashes() на символ одинарной кавычки. К таким кодировкам относятся SJIS, BIG5 и GBK. В чем же заключается ошибка addslashes()? Дело в том, что addslashes() просто добавляет обратный слэш перед одинарными (0x27) и двойными кавычками (0x22), перед бэклсэшем (0x5c) и перед null байтом (0x00), причем эта функция не проверяет какой символ в итоге будет создан. Например, в кодировке GBK мультбайтовый символ 0xbf27 не является допустимым, однако 0xbf5c воспринимается как приемлемый. Точно так же и для BIG5: 0xa327 – неправильный символ, но после того, как addslashes() добавит слэш перед 0x27, у нас получится следующая последоавтельность байтов: 0xa35c27. 0xa35c является корректным мультибайтовым символом для кодировки BIG5, т.е. он будет рассматриваться как один символ, в то время как 0x27 станет самостоятельным и одинарная кавычка останется без экранирования.

SQL-инъекция в DDOS-боте Illusion

Обнаружением данной уязвимости я обязан Ragnar’у, собственно по его просьбе сейчас и пишу этот пост с целью объяснения сути самой баги. Однажды он постучал мне в асю и попросил поковыряться в web-админке DDOS-бота Illusion – видимо хотел угнать чей-то ботнет =) Предложение я принял и через некоторое время нашел уязвимость, а именно SQL-инъекцию. Так как основной функционал админки был недоступен для неавторизованных пользователей (а пароль хранился прямо в исходнике =\), то свои надежды я возложил на интерфейс для ботов, что и принесло мне успех. Итак, рассмотрим, какие значения параметров скрипт ожидает от ботов и в чем заключается уязвимость.

Автоматизированная эксплуатация SQL-инъекций

Введение

Я уверен, что тебе не раз приходилось тратить довольно много времени на такое нудное и малоинтересное занятие, как определение количества столбцов между SELECT и WHERE, перебор названий таблиц, посимвольный брутфорс при атаках вида SQL Injection. Не удивлюсь, если ты скажешь, что тебе уже порядком надоело делать это вручную, каждый раз встречая эту уязвимость. Данная статья рассчитана на человека, знакомого со SQL инъекциями – в ней мы рассмотрим методы их автоматизированной эксплуатации на примере использования PHP скрипта SQLBruter 0.2, созданного мною специально для этих целей.

SQLBruter v0.2

Опубликовано в журнале “Хакер”
#104, X-Tools

Назначение

SQLBruter – многофункциональный скрипт, реализующий перебор различными методами при атаках типа SQL Injection. При запросах с использованием UNION очень часто требуется определить количество выбираемых полей, названия таблиц и стобцов. Все это можно сделать с помощью моего скрипта. Кроме этого, SQLBruter осуществляет посимвольный перебор, т.е. с использованием конструкций типа “AND ascii(lower(substring([query],1,1))) > 97” и т.д. Важно сказать, что вам не придется указывать позицию символа – нужно лишь указать запрос и строку, возвращенную сервером, и в итоге вы получите полное содержание поля (например с хешем). Также в скрипте предусмотрено выведение результатов в файл и использование прокси.