TGViewer
Standoff Bug Bounty Tips Standoff Bug Bounty Tips @standoff_bb_tips · 1.66K subscribers
Post #168 1.46K
Unicode-суррогаты: как один битый символ превращается в обход валидации 🔡

В некоторых системах одиночные Unicode-суррогаты работают необычно: валидатор пропускает их как обычные буквы, а внутренние сервисы преобразуют их в вопросительный знак.

В ряде баз данных ? — это wildcard. Так и возникает уязвимость, которая даёт доступ к данным 💭

Юникод использует диапазон символов U+0000–U+10FFFF. Но старый формат UTF-16 не мог напрямую закодировать все символы выше U+FFFF, поэтому придумали специальный механизм — суррогаты. Есть два типа:

High surrogates — старшие суррогаты
Диапазон: U+D800–U+DBFF

Low surrogates — младшие суррогаты
Диапазон: U+DC00–U+DFFF

По отдельности они не являются валидными символами. Но если записать их пару (high + low), то вместе они кодируют один символ за пределами базовой области Unicode (например эмодзи).

Пример: эмодзи 😄 — это комбинация двух суррогатов в UTF-16.


Багхантер Krzysztof Balas нашел публичный эндпоинт, который отдавал данные пользователя, если ввести:

⚫️ дату рождения,
⚫️ фамилию,
⚫️ ZIP-код.

Авторизация не требовалась. После первого репорта разрабы закрыли все спецсимволы, URL-encoding и даже «юникодные аналоги» запрещённых символов.

Но осталось кое-что ещё — одиночные Unicode-суррогаты, например \udc2a. Если отправить что-то вроде:

"lastname": "D\udc2a\udc2a",
"zipcode": "1\udc2a\udc2a\udc2a\udc2a"


, то парсеры UTF-8 не смогут корректно отобразить Unicode-суррогаты, которые часто используются в эмодзи с low и high парами. Все, что ты получаешь при попытке их отобразить, — это символ замены Юникода.

Некоторые парсеры, по-видимому, идут еще дальше и упрощают символ замены до вопросительного знака (?), что и приводит к возникновению уязвимости 💡
  • ❤ 7
  • 🔥 2
  • 🤯 2
More from @standoff_bb_tips
  1. Oct 11, 2026Что скрывается в имени HTML-тега? Может быть, JavaScript? Gareth Heyes из PortSwigger пока…
  2. Oct 4, 2026Хочешь прокачать своего багбаунти-агента ❓ Обрати внимание на Model-Context-Protocol (MCP)…
  3. Oct 3, 2026Эксплуатация багов, связанных с ошибками в бизнес-логике 🤔 Логические баги — это когда ко…
  4. Sep 7, 2026Post #255
  5. Sep 5, 2026Мы накидали 6 разных вариантов атак для простого GET-запроса на редактирование профиля ⤵️…
  6. Aug 15, 2026Stored XSS через картинку: проверь Content-Type override 😵‍💫 Иногда загрузка изображений…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →