PDA

Просмотр полной версии : Недостаточная фильтрация GBK в addslashes().


guest3297
18.02.2008, 18:18
Недостаточная фильтрация GBK в addslashes().




Оригинал (http://www.hack-shop.org.ru/board/t93/)
Автор : [ cash ]
Дата : 08.12.2007
Продукт: php + mysql
Копирайты : ]Источник (http://shiflett.org/blog/2006/jan/addslashes-versus-mysql-real-escape-string[/B)


[B][Intro]

Статья для общего развития.

В первые о данной уязвимости заговорили в 2006, обсуждение шло о недостаточной фильтрации в функции addslashes() ставшей так популярной для быстро закрытия SQL иньекций. Как всегда сначало общественность не достойно отреагировала на появление данной уязвимости за что и была наказана. Многие достачно крупные и очень крупные серверы подверженны данной уязвимости. Уязвимость присутствует в версиях MySQL:


4.1.х -> 4.1.20
5.0.x -> 5.0.22
Уязвимость позволяет составить запрос к базе данных.

[Description]

И так функция addslashes() некорректно обрабатывает 3 различные кодировки SJIS, BIG5 (болле известную как CP950), и GBK(CP936). Все эти кодировки основаны на двоичной системе. Первый адвизори вышел для GBK поэтому сегодня мы будем рассматривать именно данную кодировку. В GBK символы интерпритируются по 1. 0xbf27 состоит из 2 символов в 2 системе именно этот символ будет некорректно отфильтрован, 0xbf5c будет так не корректно отфильтрован и вызовет ошибку так как будет недопустимый символ (\). Рассмотрим теперь эти данные обработанные функцией addslashes(). Первый вариант 0xbf27 будет интерпритирован как одиночные символы 0xbf при переводе будет (¿), а затем 0x27 ('), и второй вариант 0xbf5c, 0xbf при переводе будет (¿), а затем 0x5c (\).


Теперь рассмотрим саму функию зачем и для чего она нужна. Функция addslashes(string str) возвращает сроку str, в которой перед каждым спецсимволом добавлен обратный слэш (\), например для последующего использования этой строки в запросе к базе данных. Экранируются одиночная кавычка ('), двойная кавычка ("), обратный слэш (\) и NUL (байт NULL). Таким образом данный фильтр может пропустить некорректные символы символы к базе данных, а именно ('). После чего станет возможно составления запроса к базе данных.

Рассмотрим группу запросов:

Имея синтаксис бд.

CREATE TABLE tables (
id VARCHAR(32) CHARACTER SET GBK,
data VARCHAR(8000) CHARACTER SET GBK,
PRIMARY KEY (data)
);
mysql_query("SELECT data FROM tables WHERE field='".$id."'");Изначально уязвимый скрипт (magic_quotes_gpc=off), эксплатировать его мы может передав в параметре $id следующий запрос:
$_GET['id'] = "' union select 1,2/*";Следующий запрос:
mysql_query("SELECT data FROM tables WHERE id='".addslashes($id)."'");
В данном случае что бы составить корректный запрос нам обязательно надо закрыть параметр "id='" и привести его к виду "id='1'", но передать одинарную кавычку мы не сможем, так как она экранируется. Если версия нашей базы данных совпадает с одной из указанных выше мы можем применить данный способ в деле, передав следующий пакет:

$_GET['id'] = chr(0xbf) . chr(0x27) . ' union select 1,2/*';Данный метод будет работать только при magic_quotes_gpc = OFF. Так как при включенном magic_quotes_gpc по умолчанию все $_GET и $_POST запросы а также данные COOKIE буду обрабатываться функцией addslashes() что приведет к что придет к двойной фильтрации. Или же данный метод будет работать при включенном magic_quotes_gpc, но без использывания addslashes() в коде, что предполагает первый рассмотренный нами код.

[Exploiting and Secure]

И немного о защите, так как данные виды кодировок мало распространены самая простая защита не использовать данные кодировки в базах даных.

В некоторых случаях если мы можем как было изменить кодировку в базе данных (например востановить или же отбекапить данные изменив кодировку, или же сделать намеренно это оставив тем самым дорк или же брешь в системе для последуешего взлома).


[ cash ] Hack-Shop.Org.Ru (c)

Isis
20.02.2008, 15:07
недостаточной фильтрации в функции addslashes() ставшей так популярной для быстро закрытия SQL иньекций
Не думаю что она сейчас популярная для закрытия SQL инъекций....
mysql_escape_string используется чаще...
Или ты про 2006 год?