Как стать автором
Обновить

Комментарии 61

Я бы при помощи Tidy приводил бы ввод к XML, а дальше можно при помощи того же самого XSLT прибивать лишнее.
Пробовал Jevix & htmlpurifier. Остановился на jevix'e, который опказался гораздо понтянее и проще и легче (заметно легче). Алco присутствует полезная связка Jevix'a и Geshi(подсветка кода) + video парсера, и все это в одной библиотеки дял CI: www.coolweb.su/blog/7.html
Warning: Element '<style><a>' is not supported (for information on implementing this, see the support forums) in /home/ezyang/htmlpurifier.org/live/library/HTMLPurifier/HTMLDefinition.php on line 265
К тому же мне работать с white list не так удобно как с black list.
Если
если <style> еще можно понять, то что плохого сделал старый добрый <a> ???
Видимо плохо ему стало именно от style, с «a» без «style» у него всё хорошо.
black list — зло, т.к. все возможные дыры предусмотреть невозможно.
Да, постепенно прихожу к тому же выводу. Хоть blacklist и whitelist у меня в разы, обрезать редкий тэг меньшая беда чем пропустить вредоносный код. Честно говоря, до прочтения вот этого ha.ckers.org/xss.html я и не представлял что xss атаки бывают настолько разнообразны.
А вы можете написать 100%-ный black list?
Не могу, согласен с Вами. Я просто знал о некоторых хитрых способах обойти защиту, но не знал что их так много =( Теперь уже склоняюсь к white list.
Старенький, но проверенный phpinputfilter
Данная фича тоже фильтруется
а сколько их ещё не фильтруется…
> Кому интересно поучавствовать в проекте или взломать XSS-фильтр, пишите в личку.
создай страничку с песочницей…

dev.plakmag.ru/xss:
&lt/textarea&gt &lt script&gt alert('xss');&lt/script&gt
(удалите пробелы).
Ну максимум, Вы украдете свои данные.
Почему? Контекстно загрузить страницу с передачей POST-параметра и последующим воровством cookies никто не отменял.
OK! Обновлено
вот такие ссылки проходят в фф
ой, не знаю пустит ли фльтр хабра))
XSS
гыгыгы
1
хабр не пропустил)
А ваш — пропустил вот такой xss

Вобщем не стило хаять кодеигнайтер. Его защиту я так и не смог пробить, а ваша свалилась через 10 минут
Я CI не хаял, а просто показал один пример. Благодаря Вашему фидбеку данная уязвимость будет устранена ))
Обновлено! Значения в аттрибутах @href @src пропускаются через «rawurldecode»
т.е. сразу выведите читсый javаscript вместо непонятных символов?
Библиотека для фильрации XSS в codeigniter совсем не зря заменяет javаscript на [removed] Совсем. Не зря. Вы слишком самоуверены мне кажется. Не разобравшись толком раскритиковали выбранный кодеигнайтером метод и предложили свой, не потрудившись даже прогнать его через топ 500 xss скриптов.
если у Вас есть на руках Ваш топ 500, то милости прошу на обозрение.
А чистый javascript, конечно же, не пропускается ;)
Этот ТОП использовался как отправная точка для написания фильтра, все примеры проверялись на корректное преобразование
А разве такой способ работает в браузере? Это вообще уязвмость?
Скорее всего нет…
Во всяком случае Opera 10 не преобразует %3C в < или %3A в двоеточие
Дык а смыл тогда блокировать? давайте теперь и русское слово «яваскрипт» банить :) Вот за этои не люблю эти фильтры — работают бестолково, видимо единтвенный нормальный способ — разрираьть текст по тегам/аттрибутам/виду ссылки и пересобирать заново.

Если надо будет банить «яваскрипт», то будем банить
знакомые всё ники)
Простите,
<img src='http://ya.ru/logo.gif'bo=o"onload="alert();>
Спасибо за пример
Обновлено! Теперь в unquoted значениях аттрибутов все двойные кавычки экранируются.
<img src='http://ya.ru/logo.gif' bo="o\"onload=\"alert();" />
Ещё вот такая штука прокатывает:

<img src="http://ya.ru/logo.png" style=color:red;"onload=alert('XSS!');a="1>
Адский парсер! Я имел в виду вот это: <img src="http://ya.ru/logo.png" style=color:red;"onload=alert('XSS!');a="1>
Ох ты ж ёканый бабайка, получите-ка лучше картинку:
Вы не могли бы пояснить, благодаря чему этот код сработает?
Я в XSS не силен, поэтому мне он с виду кажется абсолютно безумным и не дееспособным.
Как показала практика и примеры других участников, экранирование — не лучший способ, поэтому двойные кавычки в unquoted значения аттрибутов заменяются на "
фу-ты, ну-ты на & quot;
ооо.
Я покажу вам страшную вещь — презентацию с конференции BlackHat.
Когда я её прочитал, я полчаса сидел в шоке.

Оригинальный линк лежит, поэтому перезалил к себе: artyfarty.ru/blackhat_xss.rar

Советую всем хабраюзерам ознакомится. Вообще, сиё творение достойно топика-ссылки или топика-перевода.
Спойлер:
(É=[Å=[],µ=!Å+Å][µ[È=-~-~++Å]+({}+Å) [Ç=!!Å+µ,ª=Ç[Å]+Ç[+!Å],Å]+ª])() [µ[Å]+µ[Å+Å]+Ç[È]+ª](Å)

($=[$=[]][(__=!$+$)[_=-~-~-~$]+({}+$)[_/_]+($$=($_=!''
+$)[_/_]+$_[+$])])()[__[_/_]+__[_+~$]+$_[_]+$$](_/_)

Это тоже xss-вектор. Я правда до конца не понял принципа именно этой техники, но там и других извращений мама мия.
Это не вектор, это кусок кода на яваскрипте, отличающийся от нормального тем, что в нем не ипользуюстя симолы [a-z0-9], только и всего. Попробуйте этой фигней что нибудь взломать.
Адресуйте это автору презентации. Как я написал, я сам не до конца понял, как это применить, но выглядит впечатляюще :)
Сходу бага в обработке IE «expression», по мотивам onsec.ru/vuln?id=5
Обновлено! IE «expression» фильтруется даже если каждый символ экранируется символом \ или C-подобным комментарием /*XSS*/:

style="onsec:e\x\p\re\s\s\i\o\n(alert('XSS'))"


или
style="onsec:e/*XSS*/x/*XSS*/p/*XSS*/re/*XSS*/s/*XSS*/s/*XSS*/i/*XSS*/o/*XSS*/n(alert('XSS'))"

Остается только пожелать успехов в этом неравном бою с бесконечностью :)
Странно, никто не вспомнил про htmLawed, а ведь он, имхо, достаточно крутой соперник и джевиксу и саксу и инпутфильтру.

вывод сделан опытным путем, вставвляя дескрипшены айтемов с ебэя и смотря на то, что в итоге приходит.
надо было чтобы всё было один в один, тока без опасных элементов. (не все дескры подходили, т.к. в некоторых менюхи генерились динамически ЖС-ом. на такие забивали)
сначала юзали джевикс, но он подвел, потом сакс, подвел, вернули джевикс — и там карачун.
да и у джевикса рекурсивный вывод жрал много памяти при дереве > 20-и нодов, при этом пхп сначала умирал с ошибкой нестед левел 100 ричед
Мне стукнул в аську человек, не имеющий аккаунта тут (32523553), и попросил выложить ещё одну строку, обходящую фильтр:
<img src='o.gif'bo=o"onerror=alert();//>

Он очень желает присоединится к дискуссии и ищет инвайт. У меня, увы, инвайта нет.

Он какбы говорит нам: «экранизация там не играет роли. в прошлом рабочем варианте она помогла только потому что перед знаком равно возник слеш»
Если пропускать html-тэги, то вероятность xss всегда будет существовать.
Почему бы не использовать bb-код?
А если используется WYSIWYG редактор? То HTML нужно преобразовывать в bb-код, а потом обратно?
Так делает IPB.
В общем, по итогам обсуждения и четния ha.ckers.org, у меня такие мысли:

Фильтр автора — несовершенен, т.к. использует конечные автоматы (чтает по символу), что очень медленно, фильтрует по черным спискам (что также плохо, т.к. не предугадаешь все уязвимости).

Моя идея — надо делать одно из 2: 1) преобразовывать входные данные в дерево DOM, и проходить по нему белым списком, затем пересобирать уже валидный и безопасный HTML 2) чтобы побыстрее делать — парсить регулярками на теги/аттрибуты/текст и опять же, проходить белым списком, и пересобирать заново. Ключевое слово — пересобирать, чтобы обезвредить выходной код. В этом случае всякие уязвимости с незакрытими тегами, двойными скобками и прочими нарушениями синтаксиса просто превратятся в безвредный обычный текст.
Идея с белым листом мне очень нравится, скорее всего буду развивать защиту в этом ключе.
Изначально алгоритм с конечным автоматом заложен для реализации как php extension, что будет крайне быстро.
Если по-Вашему итог в обсуждении и поставлен, то в развитии кода ставится «to be continued».
Так объясните хоть, чем ваш способ, медленно ковыряться по одному символу, лучше идеи разрезать регуляркой код на куски и их перебирать, а потом склеить назад?
1. разрезание и фильтрация тегов идет в одном цикле без повторных действий.
2. повторюсь, что метод с конечным автомат (ковырянием по одному символу) заложен для реализации как php extension
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации