- Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
- 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** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
- **Compartilhe suas técnicas de hacking enviando PRs para o [repositório hacktricks](https://github.com/carlospolop/hacktricks) e [hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)**.
O **Regular expression Denial of Service (ReDoS)** é um ataque de [Negação de Serviço](https://owasp.org/www-community/attacks/Denial\_of\_Service), que explora o fato de que a maioria das implementações de Expressão Regular podem chegar a situações extremas que as fazem trabalhar muito lentamente (exponencialmente relacionado ao tamanho da entrada). Um atacante pode então fazer com que um programa que usa uma Expressão Regular entre nessas situações extremas e fique pendurado por um longo período de tempo.
O algoritmo ingênuo de Expressão Regular constrói um [Autômato Finito Não-Determinístico (AFND)](https://en.wikipedia.org/wiki/Nondeterministic\_finite\_state\_machine), que é uma máquina de estados finitos onde para cada par de estado e símbolo de entrada pode haver vários possíveis estados seguintes. Em seguida, o mecanismo começa a fazer transições até o final da entrada. Como pode haver vários possíveis estados seguintes, um algoritmo determinístico é usado. Este algoritmo tenta um por um todos os caminhos possíveis (se necessário) até que uma correspondência seja encontrada (ou todos os caminhos sejam tentados e falhem).
Para a entrada `aaaaX`, existem 16 caminhos possíveis no gráfico acima. Mas para `aaaaaaaaaaaaaaaaX` existem 65536 caminhos possíveis, e o número dobra para cada `a` adicional. Este é um caso extremo em que o algoritmo ingênuo é problemático, porque ele deve passar por muitos caminhos e, em seguida, falhar.
Observe que nem todos os algoritmos são ingênuos, e na verdade os algoritmos de Regex podem ser escritos de maneira eficiente. Infelizmente, a maioria dos motores de Regex hoje tentam resolver não apenas Regexes "puros", mas também Regexes "expandidos" com "adições especiais", como referências inversas que nem sempre podem ser resolvidas de maneira eficiente (veja **Padrões para linguagens não regulares** em [Wiki-Regex](https://en.wikipedia.org/wiki/Regular\_expression) para mais detalhes). Então, mesmo que a Regex não seja "expandida", um algoritmo ingênuo é usado.
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).
Em um CTF (ou recompensa por bugs), talvez você **controle a Regex com a qual uma informação sensível (a flag) é correspondida**. Então, se for útil fazer com que a **página congele (tempo limite ou tempo de processamento mais longo)** se uma **Regex corresponder** e **não se corresponder**. Dessa forma, você poderá **exfiltrar** a string **caractere por caractere**:
* 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 este: `<flag>(((((((.*)*)*)*)*)*)*)!`
* Neste [**writeup**](https://ctftime.org/writeup/25869) ele usou: `^(?=${flag_prefix}).*.*.*.*.*.*.*.*!!!!$`
- Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
- 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** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
- **Compartilhe seus truques de hacking enviando PRs para o [repositório hacktricks](https://github.com/carlospolop/hacktricks) e [hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)**.