что такое символы zalgo
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:
Cледующий JavaScript будет генерировать визуальные дефекты, используя один из символов выше ͂͂͂͂͂͂͂͂͂͂͂͂͂͂͂͂͂͂͂͂:
Принцип построения «фаззящей» последовательности проста — вывод символов максимально возможно горизонтальной длины, либо преображение и отображение с «разрывом». Этом поможет достичь эффекта некорректного отображения множественных символов UNICODE как пробельных, например так:
ັັັalert(ັັັ’XSS Edge’ັັັ)ັັັ
Здесь ожидаемое поведение — это фильтрация, но на самом деле происходит событие Alert. Эти ошибки связаны с некорректным парсингом смешанного содержимого запроса.
Есть схожие методы обхода защитных средств, основанные на внедрении UNICODE символов:
†‡•<img src=a onerror=javascript:alert(‘test’)>…‰€ (репорт на HackerOne).
Эти методы могут быть как обособленными векторами применения, так и конкретными, связанными со спецификой того или иного приложения, например AngularJS:
В ветке обсуждения отображения последовательностей представлен еще один пример обхода парсинга:
Основной смысл такого обхода — преобразования символов, проходящих фильтры, в необходимую последовательность, на выходе дающую работающий (уже прошедший фильтр) пейлоад. В качестве примера привожу изображение, демонстрирующее такое преобразование:
Исследователем Gareth Heyes опубликован фаззер, объединяющий UNICODE совмещение и Zalgo, названный им Z̴a҉̠͚l͍̠̫͕̮̟͕g͚o̯̬̣̻F̮̫̣̩͓͟ͅu̯z̡͉͍z̪͈̞̯̳̠ͅi̴̜̹̠̲͇n̰g̱͕̫̹͉͓ для выявлении последовательностей UNIСODE символов, преобразующихся в валидный javascript.
Таким образом был составлен пейлоад для обхода фильтрации EDGE, заключающийся в добавлении символов, обрабатываемых как пробельные. Таким образом была выявлена последовательность в виде символа 837 вместе с любым символом из диапазона 768-879:
Таким образом получается валидный пейлоад: ̀̀̀̀̀́́́́́̂̂̂̂̂̃̃̃̃̃̄̄̄̄̄̅̅̅̅̅̆̆̆̆̆̇̇̇̇̇̈̈̈̈̈̉̉̉̉̉̊̊̊̊̊ͅͅͅͅͅͅͅͅͅͅͅalert(̋̋̋̋̋̌̌̌̌̌̍̍̍̍̍̎̎̎̎̎̏̏̏̏̏ͅͅͅͅͅ1̐̐̐̐̐̑̑̑̑̑̒̒̒̒̒̓̓̓̓̓̔̔̔̔̔ͅͅͅͅͅ)̡̡̡̡̡̢̢̢̢̢̛̛̛̛̛̖̖̖̖̖̗̗̗̗̗̘̘̘̘̘̙̙̙̙̙̜̜̜̜̜̝̝̝̝̝̞̞̞̞̞̟̟̟̟̟̠̠̠̠̠̣̕̕̕̕̕̚̚̚̚̚ͅͅͅͅͅͅͅͅͅͅͅͅͅͅͅ
Тема использования UNICODE-нормализации для обхода защитных средств далеко не нова (но и не сильно распространена), но тем не менее, позволяет находить новые способы обхода фильтрации.
Zalgo
Не так давно на сайты вебмастеров набежала очередная волна школьников, которая спамила в комментарии мозговыносящий, ломающий верстку, текст. Такой текст еще называют ZALGO. Пришлось мне в оперативном порядке искать лекарство от этой напасти.
Сам по себе ZALGO текст представляет из себя ряд повторяющихся друг за другом надстрочных символов. Такой функционал был добавлен в Unicode для того, чтобы отображать арабские, немецкие(Ü) и китайско-японские алфавиты, поэтому какой-бы то нибыло видимой защиты от данного явления — нет. И единственный способ борьбы со спамерами использующими эту, с позволения сказать, уязвимость — ручная модерация и бан.
К примеру блог zenpr, в одно время, был доверху забит такого рода спамными комментариями.
Потом анонимус решил позверствовать на ТопСапе Чане, что и побудило меня найти лекарство от этой «заразы».
Не хватало еще, чтобы мою борду перекинулась эта эпидемия! Полез в гугл и на Stackoverflow для поиска решения этой роблеммы. И не нашел оного. Точнее было одно решение, которое предполагало чистку всех символов, кроме букв и цифр. Но оно было, мягко говоря не оптимальным и не кошерным. Пришлось изучать матчасть и писать свой костыль.
В результате моих изысков было получено два решения.
Полностью удаляет все надбуквенные метки. То есть буква Ё станет после обработки просто буквой Е. Если вы готовы смириться с этой утратой — используйте эту регулярку.
Второе, более либеральное:
Данный вариант удаляет все буквенные метки выше 1-го уровня вложенности. Проще говоря буева Ё так и останется буквой Ё.
Такой текст — ͐̈ͩ̎Zͮ͌ͦ͆ͦͤÃ̉͛̄ͭ̈̚LͫG̉̋͂̉Oͨ͌̋͗!
Будет преобразован в такой — ZÄLͫGO!
Так-же я зарегистрировался на Stackoverflow и на ломанном энглише запилил туда результаты своих изысканий — мой ответ самому себе на Stackoverflow
Надеюсь, что это будет полезно, ведь даже крупные проекты вроде хабра и лайфжурнала не защищены от такого рода «атак».
В Юникоде основным блоком сочетания диакритических знаков для европейских языков и международного фонетического алфавита является U + 0300 – U + 036F. Комбинированные диакритические знаки также присутствуют во многих других блоках символов Unicode. В Юникоде диакритические знаки всегда добавляются после главного символа (в отличие от некоторых старых наборов комбинированных символов, таких как ANSEL ), и к одному и тому же символу можно добавить несколько диакритических знаков, в том числе сложенные диакритические знаки сверху и снизу, хотя некоторые системы могут этого не делать. сделать их хорошо.
СОДЕРЖАНИЕ
Диапазоны Unicode
Следующие блоки предназначены специально для комбинирования символов:
Таблица кодов официального консорциума Unicode по объединению диакритических знаков (PDF) | ||||||||||||||||
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | А | B | C | D | E | F | |
U + 030x | ◌̀ | ◌́ | ◌̂ | ◌̃ | ◌̄ | ◌̅ | ◌̆ | ◌̇ | ◌̈ | ◌̉ | ◌̊ | ◌̋ | ◌̌ | ◌̍ | ◌̎ | ◌̏ |
U + 031x | ◌̐ | ◌̑ | ◌̒ | ◌̓ | ◌̔ | ◌̕ | ◌̖ | ◌̗ | ◌̘ | ◌̙ | ◌̚ | ◌̛ | ◌̜ | ◌̝ | ◌̞ | ◌̟ |
U + 032x | ◌̠ | ◌̡ | ◌̢ | ◌̣ | ◌̤ | ◌̥ | ◌̦ | ◌̧ | ◌̨ | ◌̩ | ◌̪ | ◌̫ | ◌̬ | ◌̭ | ◌̮ | ◌̯ |
U + 033x | ◌̰ | ◌̱ | ◌̲ | ◌̳ | ◌̴ | ◌̵ | ◌̶ | ◌̷ | ◌̸ | ◌̹ | ◌̺ | ◌̻ | ◌̼ | ◌̽ | ◌̾ | ◌̿ |
U + 034x | ◌̀ | ◌́ | ◌͂ | ◌̓ | ◌̈́ | ◌ͅ | ◌͆ | ◌͇ | ◌͈ | ◌͉ | ◌͊ | ◌͋ | ◌͌ | ◌͍ | ◌͎ | CGJ |
U + 035x | ◌͐ | ◌͑ | ◌͒ | ◌͓ | ◌͔ | ◌͕ | ◌͖ | ◌͗ | ◌͘ | ◌͙ | ◌͚ | ◌͛ | ◌͜ | ◌͝ | ◌͞ | ◌͟ |
U + 036x | ◌͠ | ◌͡ | ◌͢ | ◌ͣ | ◌ͤ | ◌ͥ | ◌ͦ | ◌ͧ | ◌ͨ | ◌ͩ | ◌ͪ | ◌ͫ | ◌ͬ | ◌ͭ | ◌ͮ | ◌ͯ |
Заметки 1. ^ Начиная с версии Unicode 13.0 |
Кодовые точки U + 032A и U + 0346–034A являются символами IPA :
Кодовые точки U + 034B – 034E являются диакритическими знаками IPA для расстройства речи :
U + 034F является « объединяющим графемным соединителем » (CGJ) и не имеет видимого глифа.
Комбинированная таблица кодов расширенного официального консорциума Unicode с диакритическими знаками (PDF) | ||||||||||||||||
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | А | B | C | D | E | F | |
U + 1ABx | ◌᪰ | ◌᪱ | ◌᪲ | ◌᪳ | ◌᪴ | ◌᪵ | ◌᪶ | ◌᪷ | ◌᪸ | ◌᪹ | ◌᪺ | ◌᪻ | ◌᪼ | ◌᪽ | ◌᪾ | ◌ᪿ |
U + 1ACx | ◌ᫀ | |||||||||||||||
U + 1ADx | ||||||||||||||||
U + 1AEx | ||||||||||||||||
U + 1AFx | ||||||||||||||||
Заметки 1. ^ Начиная с версии Unicode 13.0 2. ^ Серые области обозначают неназначенные кодовые точки. |
Таблица кодов официального консорциума Unicode Дополнение по комбинированным диакритическим знакам (PDF) | ||||||||||||||||
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | А | B | C | D | E | F | |
U + 1DCx | ◌᷀ | ◌᷁ | ◌᷂ | ◌᷃ | ◌᷄ | ◌᷅ | ◌᷆ | ◌᷇ | ◌᷈ | ◌᷉ | ◌᷊ | ◌᷋ | ◌᷌ | ◌᷍ | ◌᷎ | ◌᷏ |
U + 1DDx | ◌᷐ | ◌᷑ | ◌᷒ | ◌ᷓ | ◌ᷔ | ◌ᷕ | ◌ᷖ | ◌ᷗ | ◌ᷘ | ◌ᷙ | ◌ᷚ | ◌ᷛ | ◌ᷜ | ◌ᷝ | ◌ᷞ | ◌ᷟ |
U + 1DEx | ◌ᷠ | ◌ᷡ | ◌ᷢ | ◌ᷣ | ◌ᷤ | ◌ᷥ | ◌ᷦ | ◌ᷧ | ◌ᷨ | ◌ᷩ | ◌ᷪ | ◌ᷫ | ◌ᷬ | ◌ᷭ | ◌ᷮ | ◌ᷯ |
U + 1DFx | ◌ᷰ | ◌ᷱ | ◌ᷲ | ◌ᷳ | ◌ᷴ | ◌᷵ | ◌᷶ | ◌᷷ | ◌᷸ | ◌᷹ | ◌᷻ | ◌᷼ | ◌᷽ | ◌᷾ | ◌᷿ | |
Заметки 1. ^ Начиная с версии Unicode 13.0 2. ^ Серая область указывает неназначенную кодовую точку. |
Объединение диакритических знаков для символов Официальная таблица кодов Консорциума Unicode (PDF) | ||||||||||||||||
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | А | B | C | D | E | F | |
U + 20Dx | ◌⃐ | ◌⃑ | ◌⃒ | ◌⃓ | ◌⃔ | ◌⃕ | ◌⃖ | ◌⃗ | ◌⃘ | ◌⃙ | ◌⃚ | ◌⃛ | ◌⃜ | ◌⃝ | ◌⃞ | ◌⃟ |
U + 20Ex | ◌⃠ | ◌⃡ | ◌⃢ | ◌⃣ | ◌⃤ | ◌⃥ | ◌⃦ | ◌⃧ | ◌⃨ | ◌⃩ | ◌⃪ | ◌⃫ | ◌⃬ | ◌⃭ | ◌⃮ | ◌⃯ |
U + 20Fx | ◌⃰ | |||||||||||||||
Заметки 1. ^ Начиная с версии Unicode 13.0 2. ^ Серые области обозначают неназначенные кодовые точки. |
Таблица кодов официального консорциума Unicode Combining Half Marks (PDF) | ||||||||||||||||
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | А | B | C | D | E | F | |
U + FE2x | ◌︠ | ◌︡ | ◌︢ | ◌︣ | ◌︤ | ◌︥ | ◌︦ | ◌︧ | ◌︨ | ◌︩ | ◌︪ | ◌︫ | ◌︬ | ◌︭ | ◌︮ | ◌︯ |
Заметки 1. ^ Начиная с версии Unicode 13.0 |
OpenType
OpenType имеет ccmp «тег функции» для определения глифов, которые представляют собой композиции или декомпозиции, включающие комбинирование символов, тег mark для определения положения комбинируемых символов на базовом глифе и mkmk для позиционирования комбинируемых символов друг на друга.