Regular expression Denial of Service - ReDoS
Denial of Service de Expressão Regular - ReDoS
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.
O Algoritmo Naïve de Regex Problemático
Verifique os detalhes em https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS
Regexes Maliciosas
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:
(a+)+
([a-zA-Z]+)*
(a|aa)+
(a|a?)+
(.*a){x} para x > 10
Todos esses são vulneráveis à entrada aaaaaaaaaaaaaaaaaaaaaaaa!
.
Cargas Úteis ReDoS
Exfiltração de String via ReDoS
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:
Neste post você pode encontrar esta regra ReDoS:
^(?=<flag>)((.*)*)*salt$
Exemplo:
^(?=HTB{sOmE_fl§N§)((.*)*)*salt$
Neste writeup você pode encontrar esta:
<flag>(((((((.*)*)*)*)*)*)*)!
Neste writeup ele usou:
^(?=${flag_prefix}).*.*.*.*.*.*.*.*!!!!$
Controle de Entrada e Regex ReDoS
Os seguintes são exemplos de ReDoS onde você controla tanto a entrada quanto o regex:
Ferramentas
Referências
Last updated