http://wm-monitoring.ru/ ')) {alert('Спасибо за то что установили нашу кнопку! =)');} else {alert('Очень жаль! =(');}"> http://wm-monitoring.ru/

Регулярное выражение Отказ в обслуживании - ReDoS

  1. Вступление
  2. Описание
  3. нападки
  4. Факторы риска
  5. Примеры
  6. Рекомендации
Это Атака ,Для просмотра всех атак, пожалуйста, посмотрите Категория атаки стр.

Последняя редакция (мм / дд / гг): 05.07.2017

Вступление

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

Описание

Наивный алгоритм регулярных выражений создает Недетерминированный конечный автомат (NFA) , который является конечным автоматом, где для каждой пары состояния и входного символа может быть несколько возможных следующих состояний. Затем двигатель начинает совершать переход до конца ввода. Поскольку может быть несколько следующих возможных состояний, используется детерминированный алгоритм. Этот алгоритм пробует один за другим все возможные пути (если необходимо) до тех пор, пока не будет найдено совпадение (или все пути будут проверены и потерпят неудачу).

Например, регулярное выражение ^ (a +) + $ представлено следующим NFA:

Для ввода aaaaX есть 16 возможных путей на приведенном выше графике. Но для aaaaaaaaaaaaaaaaX есть 65536 возможных путей, и число удваивается для каждого дополнительного a . Это крайний случай, когда наивный алгоритм проблематичен, потому что он должен пройти много-много путей, а затем потерпеть неудачу.

Обратите внимание, что не все алгоритмы наивны, и на самом деле алгоритмы Regex могут быть написаны эффективным способом. К сожалению, большинство движков Regex сегодня пытаются решить не только «чистые» регулярные выражения, но и «расширенные» регулярные выражения с помощью «специальных дополнений», таких как обратные ссылки, которые не всегда могут быть эффективно решены (см. Шаблоны для нерегулярных языков в Wiki-Regex для более подробной информации). Таким образом, даже если Regex не «расширен», используется наивный алгоритм.

Регулярное выражение называется «злом», если оно может застрять на обработанном вводе.

Шаблон Evil Regex содержит :

  • Группировка с повторением
  • Внутри повторяющейся группы:
    • Репетиция
    • Чередование с перекрытием

Примеры Злых Образцов :

  • (А +) +
  • ([A-Za-Z] +) *
  • (А | аа) +
  • (А |? А) +
  • (. * a) {x} | для х> 10

Все вышеперечисленное восприимчиво к вводу аааааааааааааааааааааааа! (Минимальная длина ввода может немного измениться при использовании более быстрых или более медленных машин).

нападки

Злоумышленник может использовать вышеизложенные знания для поиска приложений, использующих регулярные выражения, содержащие злое регулярное выражение, и отправить правильно созданный ввод, который повесит систему. В качестве альтернативы, если пользовательский ввод влияет на сам Regex, злоумышленник может внедрить Evil Regex и сделать систему уязвимой.

Факторы риска

Сеть основана на регулярных выражениях:

Сеть основана на регулярных выражениях:

В каждом слое WEB есть регулярные выражения, которые могут содержать злое регулярное выражение. Злоумышленник может повесить веб-браузер (на компьютере или, возможно, также на мобильном устройстве), повесить брандмауэр веб-приложений (WAF), атаковать базу данных и даже разместить уязвимый веб-сервер.

Например, если программист использует Regex для проверки клиентской части системы, а Regex содержит Evil Regex , злоумышленник может предположить, что тот же уязвимый Regex используется на стороне сервера, и отправить правильно созданный ввод, что стеки веб-сервер.

Примеры

1. ReGexLib, id = 1757 (подтверждение по электронной почте) - см. смелую часть, которая является Злым Регексом

^ ([a-zA-Z0-9]) (([\ -.] | [_] +)? ([a-zA-Z0-9] +)) * (@) {1} [a-z0 -9] + [] {1} (([AZ] {2,3}) |. ([AZ] {2,3} [] {1} [AZ] {2,3})). $

Входные данные:

aaaaaaaaaaaaaaaaaaaaaaaa!

2. Репозиторий регулярных выражений OWASP , Java Classname - см. Жирную часть, которая является злым регулярным выражением

^ (([az]) +.) + [AZ] ([az]) + $

Входные данные:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!

  • Откройте JavaScript
  • Найти злое регулярное выражение
  • Создайте вредоносный ввод для найденного Regex
  • Отправьте действительное значение через перехватывающий прокси
  • Изменить запрос, чтобы он содержал вредоносный ввод
  • Вы сделали!

В следующем примере проверяется, является ли имя пользователя частью пароля, введенного пользователем.

String userName = textBox1.Text; String password = textBox2.Text; Regex testPassword = новый Regex (userName); Match match = testPassword.Match (пароль); if (match.Success) {MessageBox.Show («Не включать имя в пароль.»); } else {MessageBox.Show ("Хороший пароль."); }

Если злоумышленник вводит ^ (([az]) +.) + [AZ] ([az]) + $ в качестве имени пользователя и aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa! в качестве пароля программа будет зависать.

TBD

Рекомендации

кредит

Эта статья содержит материалы, переданные OWASP Эта статья содержит материалы, переданные OWASP   , ,

А |?
Карта