Авторские статьи Недостаточная фильтрация GBK в addslashes().

Discussion in 'Статьи' started by guest3297, 18 Feb 2008.

  1. guest3297

    guest3297 Banned

    Joined:
    27 Jun 2006
    Messages:
    1,246
    Likes Received:
    639
    Reputations:
    817
    Недостаточная фильтрация 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)​
     
    4 people like this.
  2. banned

    banned Banned

    Joined:
    20 Nov 2006
    Messages:
    3,324
    Likes Received:
    1,193
    Reputations:
    252
    Не думаю что она сейчас популярная для закрытия SQL инъекций....
    mysql_escape_string используется чаще...
    Или ты про 2006 год?