Pull to refresh

XSS-червь: кто меньше?

Reading time2 min
Views9.5K
Наткнулся на днях на новость о конкурсе, в котором предлагают создать минимальный JavaScript-код, который будет сам себя копировать дальше. Автор конкурса — Robert Hansen aka RSnake, достаточно крупный специалист по информационной безопасности.

Условия



По условиям конкурса от кода требовалось следующее:

  1. Должен быть в кодировке UTF-8 или ISO-8859-1.
  2. Должен копировать себя путем POST-запроса на страницу post.php того же самого домена, откуда запускается (никаких GET'ов). В качестве текстового параметра должен выступать content. Можно предположить, что post.php будет соответствующим образом unescape'ить ваш код.
  3. Не должен возрастать в размерах при распространении (если код начинает с n байтов, он не должен возрастать на следующем шаге до n+x). Т.е. мы предполагаем, что контент будет игнорироваться скриптом post.php, если он больше n байтов.
  4. Должен запускаться в написанном виде (мы можем добавить все остальные параметры для соответствующей инъекции позже)
  5. Не должен использовать Cookie или GET-параметры строки запроса (все строки кода будут пребывать только на самой странице в качестве активного XSS).
  6. Не должен предполагать какие-либо сведения о DOM-дереве, хотя вы можете использовать class или id, если они есть в самом коде червя. Нельзя использовать поиск n-ого скрипта на странице, потому что эта информация может меняться от сайта к сайту.
  7. Должен работать, по крайней мере, в Internet Explorer 7.0 и Firefox 2.x.
  8. Должен выдавать XSS как сообщение на странице (в качестве «полезной нагрузки»).
  9. Должен работать, по крайней мере, на серверах Apache 1.3+ и Apache 2+ (т.е. не использовать какие-то серверно-зависимые вещи, связанные с другими серверами) ввиду их доминирования на рынке.
  10. Должен работать без участия пользователя или при минимальном участие, которое происходит на каждой странице (например, mouseover в произвольном месте страницы).


Проведение



Конкурс начался 4 января и закончился 10. Автор получил несколько сотен вариантов, но только два из них были минимальными и работали при всех заявленных условиях:

<form><input name="content"><img src="" onerror="with(parentNode)alert('XSS',submit(content.value='<form>'+
innerHTML.slice(action=(method='post')+'.php',155)))">


и

<form><INPUT name="content"><IMG src="" onerror="with(parentNode)submit(action=(method='post')+'.php',content.value=
'<form>'+innerHTML.slice(alert('XSS'),155))">


Длина червей: 161 байт. Как видно по коду, варианты очень сильно похожи, если не сказать, идентичны, практически, посимвольно. Полное заключение по конкурсу.

Итоги



На основе полученных результатов, RSnake опубликовал небольшую заметку, в которой пытается резюмировать, каким же образом можно защититься от таких червей (ведь минимальный код будет иметь какие-то общие сигнатуры, для того чтобы работать наиболее эффективно).

Также автор опубликовал большую статью, посвященной проблеме XSS-червей в общем, в которой утверждает, что бороться с ними очень сложно, но можно. Статья несколько длинная, но очень интересная.

Ссылки по теме





Спасибо за внимание. Буду рад комментариям.

Web Optimizator: проверка скорости загрузки сайтов
Tags:
Hubs:
Total votes 46: ↑45 and ↓1+44
Comments16

Articles