# Regular expression Denial of Service - ReDoS
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥 - 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) - Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com) - **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)**.
## Introdução **Copiado de** [**https://owasp.org/www-community/attacks/Regular\_expression\_Denial\_of\_Service\_-\_ReDoS**](https://owasp.org/www-community/attacks/Regular\_expression\_Denial\_of\_Service\_-\_ReDoS) 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. ### Descrição #### O algoritmo ingênuo de Regex problemático 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). Por exemplo, a Expressão Regular `^(a+)+$` é representada pelo seguinte AFND: ![Autômato Finito Não-Determinístico](https://owasp.org/www-community/assets/images/attacks/NFA.png) 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. #### Regexes maliciosos Uma Regex é chamada de "maliciosa" se ela puder ficar presa em uma entrada criada. **O padrão de Regex malicioso contém**: * Agrupamento com repetição * Dentro do grupo repetido: * Repetição * Alternância com sobreposição **Exemplos de Padrões Maliciosos**: * `(a+)+` * `([a-zA-Z]+)*` * `(a|aa)+` * `(a|a?)+` * `(.*a){x} para x \> 10` 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). ## Cargas úteis ReDoS ### Exfiltração de string via ReDoS 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: `^(?=)((.*)*)*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: `(((((((.*)*)*)*)*)*)*)!` * Neste [**writeup**](https://ctftime.org/writeup/25869) ele usou: `^(?=${flag_prefix}).*.*.*.*.*.*.*.*!!!!$` ### ReDoS controlando entrada e Regex 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)
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥 - 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) - Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com) - **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)**.