Недостаточная фильтрация GBK в addslashes(). Оригинал Автор : [ cash ] Дата : 08.12.2007 Продукт: php + mysql Копирайты : ]Источник [Intro] Статья для общего развития. В первые о данной уязвимости заговорили в 2006, обсуждение шло о недостаточной фильтрации в функции addslashes() ставшей так популярной для быстро закрытия SQL иньекций. Как всегда сначало общественность не достойно отреагировала на появление данной уязвимости за что и была наказана. Многие достачно крупные и очень крупные серверы подверженны данной уязвимости. Уязвимость присутствует в версиях MySQL: Code: 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). Таким образом данный фильтр может пропустить некорректные символы символы к базе данных, а именно ('). После чего станет возможно составления запроса к базе данных. Рассмотрим группу запросов: Имея синтаксис бд. Code: CREATE TABLE tables ( id VARCHAR(32) CHARACTER SET GBK, data VARCHAR(8000) CHARACTER SET GBK, PRIMARY KEY (data) ); PHP: mysql_query("SELECT data FROM tables WHERE field='".$id."'"); Изначально уязвимый скрипт (magic_quotes_gpc=off), эксплатировать его мы может передав в параметре $id следующий запрос: PHP: $_GET['id'] = "' union select 1,2/*"; Следующий запрос: PHP: mysql_query("SELECT data FROM tables WHERE id='".addslashes($id)."'"); В данном случае что бы составить корректный запрос нам обязательно надо закрыть параметр "id='" и привести его к виду "id='1'", но передать одинарную кавычку мы не сможем, так как она экранируется. Если версия нашей базы данных совпадает с одной из указанных выше мы можем применить данный способ в деле, передав следующий пакет: PHP: $_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)
Не думаю что она сейчас популярная для закрытия SQL инъекций.... mysql_escape_string используется чаще... Или ты про 2006 год?