Regular expression Denial of Service - ReDoS
Denegación de Servicio por Expresión Regular - ReDoS
Denegación de Servicio por Expresión Regular (ReDoS)
Una Denegación de Servicio por Expresión Regular (ReDoS) ocurre cuando alguien aprovecha las debilidades en cómo funcionan las expresiones regulares (una forma de buscar y hacer coincidir patrones en texto). A veces, cuando se utilizan expresiones regulares, pueden volverse muy lentas, especialmente si el texto con el que están trabajando se vuelve más grande. Esta lentitud puede llegar a ser tan mala que crece muy rápido con incluso pequeños aumentos en el tamaño del texto. Los atacantes pueden usar este problema para hacer que un programa que utiliza expresiones regulares deje de funcionar correctamente durante mucho tiempo.
El Algoritmo Naïve Problemático de Regex
Consulta los detalles en https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS
Regex Maliciosos
Un patrón de expresión regular malicioso es aquel que puede quedarse atascado con entradas diseñadas causando un DoS. Los patrones de regex maliciosos típicamente contienen agrupaciones con repetición y repetición o alternancia con superposición dentro del grupo repetido. Algunos ejemplos de patrones maliciosos incluyen:
(a+)+
([a-zA-Z]+)*
(a|aa)+
(a|a?)+
(.*a){x} para x > 10
Todos esos son vulnerables a la entrada aaaaaaaaaaaaaaaaaaaaaaaa!
.
Cargas Útiles de ReDoS
Exfiltración de Cadenas a través de ReDoS
En un CTF (o programa de recompensas por errores) tal vez controlas la Regex con la que se coincide una información sensible (la bandera). Entonces, podría ser útil hacer que la página se congele (timeout o tiempo de procesamiento más largo) si la Regex coincidió y no si no coincidió. De esta manera podrás exfiltrar la cadena caracter por caracter:
En esta publicación puedes encontrar esta regla de ReDoS:
^(?=<flag>)((.*)*)*salt$
Ejemplo:
^(?=HTB{sOmE_fl§N§)((.*)*)*salt$
En este informe puedes encontrar este:
<flag>(((((((.*)*)*)*)*)*)*)!
En este informe se utilizó:
^(?=${flag_prefix}).*.*.*.*.*.*.*.*!!!!$
Control de Entrada y Regex en ReDoS
Los siguientes son ejemplos de ReDoS donde controlas tanto la entrada como la regex:
Herramientas
Referencias
Last updated