Кардинальный метод защиты от XSS и атак по подстановке SQL-запросов

Discussion in 'Мировые новости. Обсуждения.' started by Suicide, 17 Jun 2010.

  1. Suicide

    Suicide Super Moderator
    Staff Member

    Joined:
    24 Apr 2009
    Messages:
    2,482
    Likes Received:
    7,024
    Reputations:
    693
    Ден Каминский (Dan Kaminsky), получивший известность обнаружением фундаментальной уязвимости в DNS, представил универсальную технику защиты от "SQL Injection" (подстановка SQL-запросов) и XSS (межсайтовый скриптинг) атак. Суть техники защиты от подстановки SQL-запросов в том, что при работе с пользовательскими данными в запросе к СУБД фигурируют не открытые данные, а строка в base64-представлении, в которой изначально отсутствуют спецсимволы. В отличие от традиционной практики анализа вводимых пользователем данных и экранирования опасных символов перед формированием запроса, метод Каминского по своей сути исключает человеческий фактор и возможность недосмотра при проверке.

    Для наглядности рассмотрим пример. Допустим в программе имеется строка

    $conn->query("select * from table where fname=$fname;");​


    в случае отсутствия должных проверок в переменной $fname может оказаться SQL-код, т.е. имеет место классическая "SQL Injection" уязвимость. Следуя методике Каминского, поменяв данную конструкцию на

    $conn->query(eval(b('select * from table where fname=^^fname;')));​


    , где "b" - функция враппер для подстановки операций base64-кодирования для переменных, отмеченных через маркер "^^". В итоге к СУБД будет сформирован запрос:

    select * from table where fname=b64d("VehHU.....=")​


    как видим, какое бы ни было содержимое переменной fname при обращении к СУБД оно будет всегда представлено валидной строкой, которая будет перекодирована из base64-представления уже силами СУБД.

    Похожая техника предлагается и для защиты от XSS-атак, все выводимые на страницу блоки данных изначально поступают в base64-представлении и отображаются через задействование специального JavaScript-враппера, декодирующего base64-строку и выводящего блок в заданную позицию без его интерпретации браузером.

    Пример с реализацией необходимых для осуществления защиты функций на языках PHP и JavaScript, а также дополнение к MySQL с функциями обработки строк base64 (в PostgreSQL поддержка base64 реализована через штатные функции encode/decode), доступны для свободной загрузки (http://recursion.com/interpolique.html). Презентацию с подробным описанием метода можно посмотреть http://www.scribd.com/doc/33001026/Interpolique.

    17.06.2010
    http://www.opennet.ru/opennews/art.shtml?num=26997

    http://www.darkreading.com/database_security/security/app-security/showArticle.jhtml?articleID=225700088
     
    _________________________
    1 person likes this.
  2. DoN

    DoN Member

    Joined:
    26 May 2010
    Messages:
    39
    Likes Received:
    20
    Reputations:
    0
    оке. теперь горик-второй подождем это в бд
     
  3. vvs777

    vvs777 Elder - Старейшина

    Joined:
    16 Nov 2004
    Messages:
    395
    Likes Received:
    214
    Reputations:
    4
    защита от ламо-кодеров ценой увеличения CPU time
     
  4. wildshaman

    wildshaman Elder - Старейшина

    Joined:
    16 Apr 2008
    Messages:
    477
    Likes Received:
    483
    Reputations:
    99
    почему многие считают, что проще написать такую страшную обертку, чем просто заюзать пару простых стандартных функций.Тем более, строки, числа, другие входные данные надо обрабатывать по-разному.
     
  5. Qwazar

    Qwazar Elder - Старейшина

    Joined:
    2 Jun 2005
    Messages:
    989
    Likes Received:
    904
    Reputations:
    587
    Мда, ну и глупость этот чел предложил.
     
    2 people like this.
  6. SQLHACK

    SQLHACK Остались только слоны

    Joined:
    27 Sep 2006
    Messages:
    437
    Likes Received:
    372
    Reputations:
    407
    А че за функция b() ТО, искал искал ,так и не нашел , че за врапер, просто там еще eval добавляется, мож там еще испонения кода гденить есть ?*
     
    _________________________
    1 person likes this.
  7. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    Хыыыыыыыыы!!!! Особые обстоятельства детектед!!! Ми просто смотрю в будущее
     
  8. Twoster

    Twoster Members of Antichat

    Joined:
    20 Aug 2008
    Messages:
    287
    Likes Received:
    402
    Reputations:
    159
    я что то совсем не понял! =(
    select * from table where fname=b64d("VehHU.....=")

    получается, что я ему отправляю запрос вида
    select * from table where fname=b64d("Jw==")
    после преобразования получится один фиг
    select * from table where fname='
    ? =\


    UPDATE:

    все, понял
    т.е. помимо использования функций в пхп, еще нужно переписать сорцы всех субд?

    З.Ы. Этот треш на равне с БолдженОС прямо... каникулы чтоли такие
     
    #8 Twoster, 17 Jun 2010
    Last edited: 17 Jun 2010
  9. Rebz

    Rebz Banned

    Joined:
    8 Nov 2004
    Messages:
    4,052
    Likes Received:
    1,533
    Reputations:
    1,128
    Метод оказался слишком кардинальным для Античата :\
     
  10. Twoster

    Twoster Members of Antichat

    Joined:
    20 Aug 2008
    Messages:
    287
    Likes Received:
    402
    Reputations:
    159
    Обидно просто, что реально умные вещи наших ребят остаются потеряным постом в статьях и "Вопросах по уязвимостям", а вот такие вот горе-дефенсеры пиарятся на пустом месте, причем и за счет нашего форума тоже...
    И еще обидно за низкую квалификацию специалистов-корреспондентов! =\ упомяну опять же ту же BolgenOS, такую туфту пропустили в массы, распиарили.. неужели в XXI веке нельзя найти сотрудника, имеющего хорошее IT образование? =\
     
    5 people like this.
  11. rebus2

    rebus2 Member

    Joined:
    26 Nov 2009
    Messages:
    25
    Likes Received:
    10
    Reputations:
    0
    Никто не забыт и не что не забыто :D

    Ну нашли что-то, расковыряли, отписали ну и хорошо ну и правильно.. кому надо тот докапаеться и прочтет.. и будет юзать и будет благодарен..

    тут наверно работает какой-то принцип всемирного уравновешивания.. еслиб все хорошие мысли по безопасности реализовывались тоже б не чего хорошего не было.. сколько и так дыр каждый день затыкают..
     
  12. Kakoytoxaker

    Kakoytoxaker Elder - Старейшина

    Joined:
    18 Feb 2008
    Messages:
    1,038
    Likes Received:
    1,139
    Reputations:
    350
    +1

    Ден Каминский (Dan Kaminsky), получивший известность обнаружением фундаментальной уязвимости в DNS оказался не таким уж толковым парнем, судя по этому материалу :)

    Для нормальных кодеров "проблемы SQL инъекций" вообще нет, ибо они знают как работать с данными.

    Ну а если кому-то не хватает стандартных функций пыха давно придумали PDO
     
    2 people like this.
  13. ghostwizard

    ghostwizard Member

    Joined:
    4 Dec 2005
    Messages:
    127
    Likes Received:
    36
    Reputations:
    21
    Хорош метод. Все, что достаточно, это пропатчить модуль на php (mysql.so), perl (dbi::mysql), python (не помню) и что там еще у вас, где функция сразу кодировала строку запроса и после отдавала драйверу на обработку. ИМХО, решение имеет место быть, причем начнет действовать сразу и глобально без надобности переписывать весь код.
     
    #13 ghostwizard, 17 Jun 2010
    Last edited: 17 Jun 2010
  14. Qwazar

    Qwazar Elder - Старейшина

    Joined:
    2 Jun 2005
    Messages:
    989
    Likes Received:
    904
    Reputations:
    587
    Тогда уж PDO (как написал Jokester), а иначе, как ты в драйвере будешь определять какую часть запроса пользователь наколбасил руками, а какую взял из параметров полученных извне?

    Это я к тому, что твой вариант не пашет.

    P.S.
    Речь только о php, в случае с Java или .Net наличие SQL инъекций вообще непростительно.
     
    #14 Qwazar, 17 Jun 2010
    Last edited: 17 Jun 2010
  15. ghostwizard

    ghostwizard Member

    Joined:
    4 Dec 2005
    Messages:
    127
    Likes Received:
    36
    Reputations:
    21

    Логично, об этом я не подумал... В любом случае было и такое:
    http://bugs.mysql.com/bug.php?id=18861

    Я вообще сторонник жестких проверок передаваемых значений. Не проще ли тогда делать так:

    $resname = b64function($fname);
    $conn->query(select * from table1 where fname=$resname)

    ?
     
  16. Qwazar

    Qwazar Elder - Старейшина

    Joined:
    2 Jun 2005
    Messages:
    989
    Likes Received:
    904
    Reputations:
    587
    Погугли на тему PDO, в частности binding parameters.
     
  17. ghostwizard

    ghostwizard Member

    Joined:
    4 Dec 2005
    Messages:
    127
    Likes Received:
    36
    Reputations:
    21
    Спасибо буду иметь ввиду, на php не программирую сейчас :). Вообще в линке, что я дал есть патч весьма свежий (для 5.х из рассылки) именно для mysql, который включает в себя встроенные функции для кодирования/декодирования.
     
  18. -PRIVAT-

    -PRIVAT- Banned

    Joined:
    17 Apr 2010
    Messages:
    245
    Likes Received:
    139
    Reputations:
    87
    Мы всё обойдём)
     
Loading...