Проблема прекращения в pcre


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

<!DOCTYPE data [
<!ENTITY a0 "dos" >
<!ENTITY a1 "&a0;&a0;&a0;&a0;">
<!ENTITY a2 "&a1;&a1;&a1;&a1;&a1;&a1;">
<!ENTITY a1 "&a2;&a2;&a2;&a2;&a2;&a2;">
test
<!ENTITY a1 "&a2;&a2;&a2;&ertertert;&a2;&a2;">
<!ENTITY a1 "&a2;&a2;&a2;&ertertert;&a2;&a2;">


<!ENTITY a1 "&a2;&a2;&a2;&a2;&a2;&a2;">
d
dd

<html abc>
a

<!ENTITY a2 "&a3;&a3;&a3;&a3;&a3;">
<!ENTITY a1 "&a0;&a0;&a0;&a0;&d5;">
]>
<data>&a2;</data>

И это мое действительное Правило:

(<!ENTITYs[a-zA-Z0-9]*s"(&[a-zA-Z0-9]+;){4,}">(s?)[^]]*){5,}

Чтобы объяснить цель, которую я хочу достичь:

Правило должно триггер, когда есть по крайней мере 5 сущностных линий С по крайней мере 4 из &-параметров. Если все 5 строк следуют одна за другой, нет никаких проблем, но линии сущностей не обязательно должны следовать одна за другой. Так что мне приходится ловить все остальное между двумя сущностными линиями, что делает все это большой проблемой завершения, потому что [ ^ ]] * ловит все, кроме a ] , а также ловит целые сущностные линии и делает мой Квантор {5,} совершенно бесполезным. На самом деле я не могу найти ничего хорошего решение моей проблемы.

Спасибо за вашу помощь, ребята!

1 2

1 ответ:

Вы можете использовать

(?s)<!ENTITY\s[a-z0-9]*\s"(&[a-zA-Z0-9]+;){4,}">(?:.*?<!ENTITY\s[a-z0-9]*\s"(&[a-zA-Z0-9]+;){4,}">){4,}

Смотрите демонстрацию регулярных выражений

Подробности

  • (?s) - режим DOTALL включен, . теперь соответствует любым символам
  • <!ENTITY - литеральная <!ENTITY подстрока
  • \s - пробел
  • [a-z0-9]* - 0 + буквы / цифры
  • \s - пробел
  • " - a "
  • (&[a-zA-Z0-9]+;){4,} - 4 или более повторений &, 1 + буквенно-цифровых символов, а затем ;
  • "> - a "> подстрока
  • (?: - начало сопоставления группы без захвата....
    • .*? - любые 0 + символы, как можно меньше
    • <!ENTITY\s[a-z0-9]*\s"(&[a-zA-Z0-9]+;){4,}"> - тот же шаблон, что и выше
  • ){4,} - ... 4 или более раз.