Security assessment · Lab assessment · Simulated environment

crAPI Security assessment report

This HTML report brings together the lab test notes and supporting material. It is not a word-for-word copy of the original PDF. Any available PDF is included below.

19Test cases
11FAIL cases
08PASS cases
01 / EXECUTIVE SUMMARY

Executive summary

The crAPI lab assessment covers 19 test cases: 11 FAIL and 8 PASS. These results apply to the lab, not a production system. Each count represents a test case, not a distinct security control.

EnvironmentcrAPILab application · Penetration testing
Screenshots49 ScreenshotsFrom test cases with PASS and FAIL results
02 / METHODOLOGY

Methodology

The test notes describe the feature, steps taken and observed behavior. Where available, normal requests are compared with misuse attempts to show what changed and explain the result.

  1. Scope, endpoint and baseline behavior
  2. Test steps and request variations
  3. Observed responses and security impact
  4. PASS or FAIL result, with CWE/OWASP references and remediation where applicable
03 / TEST CASES AND EVIDENCE

Test cases and evidence

Browse PASS and FAIL test cases below. Open a case to see its available screenshots and HTTP captures.

01 / 19FAIL

Broken Function Level Authorization - Workshop - Management Users Endpoint

2 screenshots · 2 HTTP captures

Vulnerability

[FAIL] Broken Function Level Authorization - Workshop - Management Users Endpoint

Description

The management endpoint /workshop/api/management/users/all -- which should be restricted to administrators -- is reachable by an ordinary authenticated user (role=user). The endpoint returns data for every user in the application.

Impact

Confidentiality: any ordinary user can download PII for all users (17 accounts): email addresses, phone numbers, and credit balances. Function-level authorization is not enforced.

CWE

CWE-285: Improper Authorization (related to CWE-639)

OWASP

API5:2023 - Broken Function Level Authorization (and API3:2023 - Excessive Data Exposure)

Scenario

Normal: an ordinary user only sees their own account data. Exploitation: the same ordinary user calls the management endpoint /workshop/api/management/users/all -> 200 returns PII for every user. The end result demonstrates CIA (Confidentiality).

Endpoint

GET http://127.0.0.1:8888/workshop/api/management/users/all

Affected feature

User Management Endpoint (crapi-workshop)

Remediation

- Enforce role-based authorization on every management/administrative endpoint; verify role=admin server-side. - Do not rely on the absence of a UI link as an access control. - Minimize the data returned.

Proof of concept

1) (Screenshot 1) NORMAL: GET /identity/api/v2/user/dashboard with an ordinary user token -> 200, own account data only (id=8). 2) (Screenshot 2) EXPLOITATION + CIA: GET /workshop/api/management/users/all with the SAME ordinary user token -> 200 returns PII for every user (17 accounts).
View source note (English)
Vulnerability: [FAIL] Broken Function Level Authorization - Workshop - Management Users Endpoint

Description:
The management endpoint /workshop/api/management/users/all -- which should be restricted to administrators -- is reachable by an ordinary authenticated user (role=user). The endpoint returns data for every user in the application.

Impact:
Confidentiality: any ordinary user can download PII for all users (17 accounts): email addresses, phone numbers, and credit balances. Function-level authorization is not enforced.

CWE:
CWE-285: Improper Authorization (related to CWE-639)

OWASP:
API5:2023 - Broken Function Level Authorization (and API3:2023 - Excessive Data Exposure)

Scenario:
Normal: an ordinary user only sees their own account data. Exploitation: the same ordinary user calls the management endpoint /workshop/api/management/users/all -> 200 returns PII for every user. The end result demonstrates CIA (Confidentiality).

Endpoint:
GET http://127.0.0.1:8888/workshop/api/management/users/all

Affected Feature:
User Management Endpoint (crapi-workshop)

Remediation:
- Enforce role-based authorization on every management/administrative endpoint; verify role=admin server-side.
- Do not rely on the absence of a UI link as an access control.
- Minimize the data returned.

POC:
1) (Screenshot 1) NORMAL: GET /identity/api/v2/user/dashboard with an ordinary user token -> 200, own account data only (id=8).
2) (Screenshot 2) EXPLOITATION + CIA: GET /workshop/api/management/users/all with the SAME ordinary user token -> 200 returns PII for every user (17 accounts).
02 / 19FAIL

Broken Object Level Authorization - Vehicle - Location Tracking

2 screenshots · 2 HTTP captures

Vulnerability

[FAIL] Broken Object Level Authorization - Vehicle - Location Tracking

Description

The vehicle location endpoint returns another user's GPS position given only a vehicle UUID. The server verifies authentication but does not verify object ownership (BOLA/IDOR).

Impact

Confidentiality: real-time physical location tracking of other users plus disclosure of their name and email; potential stalking/targeting.

CWE

CWE-639: Authorization Bypass Through User-Controlled Key

OWASP

API1:2023 - Broken Object Level Authorization

Scenario

Normal: the attacker reads the location of their own vehicle -> 200. Exploitation: the UUID is swapped for the victim's vehicle -> 200 returns the victim's location and email -> CIA (Confidentiality).

Endpoint

GET http://127.0.0.1:8888/identity/api/v2/vehicle/{vehicleId}/location

Affected feature

Vehicle Location Tracking (crapi-identity)

Remediation

- Verify vehicle ownership against the user in the token before returning the location. - Apply centralized object-level authorization checks.

Proof of concept

1) (Screenshot 1) NORMAL: GET /identity/api/v2/vehicle/9b3ce26b-d797-404b-a961-09d7e45e0d1b/location (own vehicle) with the attacker token -> 200. 2) (Screenshot 2) EXPLOITATION + CIA: replace the UUID in the path with 8ba9066d-8484-4ef7-8a7b-c0fa3cb2e687 (the VICTIM's vehicle), same token -> 200 returns GPS coordinates and the victim's email ([REDACTED-EMAIL]).
View source note (English)
Vulnerability: [FAIL] Broken Object Level Authorization - Vehicle - Location Tracking

Description:
The vehicle location endpoint returns another user's GPS position given only a vehicle UUID. The server verifies authentication but does not verify object ownership (BOLA/IDOR).

Impact:
Confidentiality: real-time physical location tracking of other users plus disclosure of their name and email; potential stalking/targeting.

CWE:
CWE-639: Authorization Bypass Through User-Controlled Key

OWASP:
API1:2023 - Broken Object Level Authorization

Scenario:
Normal: the attacker reads the location of their own vehicle -> 200. Exploitation: the UUID is swapped for the victim's vehicle -> 200 returns the victim's location and email -> CIA (Confidentiality).

Endpoint:
GET http://127.0.0.1:8888/identity/api/v2/vehicle/{vehicleId}/location

Affected Feature:
Vehicle Location Tracking (crapi-identity)

Remediation:
- Verify vehicle ownership against the user in the token before returning the location.
- Apply centralized object-level authorization checks.

POC:
1) (Screenshot 1) NORMAL: GET /identity/api/v2/vehicle/9b3ce26b-d797-404b-a961-09d7e45e0d1b/location (own vehicle) with the attacker token -> 200.
2) (Screenshot 2) EXPLOITATION + CIA: replace the UUID in the path with 8ba9066d-8484-4ef7-8a7b-c0fa3cb2e687 (the VICTIM's vehicle), same token -> 200 returns GPS coordinates and the victim's email ([REDACTED-EMAIL]).
03 / 19FAIL

Broken Object Level Authorization - Workshop - Mechanic Report

2 screenshots · 2 HTTP captures

Vulnerability

[FAIL] Broken Object Level Authorization - Workshop - Mechanic Report

Description

The mechanic_report endpoint accepts a sequential report_id and returns service reports belonging to other users (VIN and owner email) without verifying any relationship to the caller.

Impact

Confidentiality: cross-user disclosure of VIN, vehicle details, and owner email for every service report.

CWE

CWE-639: Authorization Bypass Through User-Controlled Key

OWASP

API1:2023 - Broken Object Level Authorization (and API3:2023 - BOPLA)

Scenario

Normal: read report_id=1. Exploitation: enumerate report_id (e.g. =2) -> discloses a different VIN and owner email -> CIA (Confidentiality).

Endpoint

GET http://127.0.0.1:8888/workshop/api/mechanic/mechanic_report?report_id={id}

Affected feature

Mechanic Service Report (crapi-workshop)

Remediation

- Verify that report_id belongs to the calling user/mechanic. - Use UUIDs and minimize the fields returned.

Proof of concept

1) (Screenshot 1) NORMAL: GET mechanic_report?report_id=1 with the attacker token -> 200 (reference). 2) (Screenshot 2) EXPLOITATION + CIA: change the parameter to report_id=2 -> 200 discloses another owner's VIN and email ([REDACTED-EMAIL]).
View source note (English)
Vulnerability: [FAIL] Broken Object Level Authorization - Workshop - Mechanic Report

Description:
The mechanic_report endpoint accepts a sequential report_id and returns service reports belonging to other users (VIN and owner email) without verifying any relationship to the caller.

Impact:
Confidentiality: cross-user disclosure of VIN, vehicle details, and owner email for every service report.

CWE:
CWE-639: Authorization Bypass Through User-Controlled Key

OWASP:
API1:2023 - Broken Object Level Authorization (and API3:2023 - BOPLA)

Scenario:
Normal: read report_id=1. Exploitation: enumerate report_id (e.g. =2) -> discloses a different VIN and owner email -> CIA (Confidentiality).

Endpoint:
GET http://127.0.0.1:8888/workshop/api/mechanic/mechanic_report?report_id={id}

Affected Feature:
Mechanic Service Report (crapi-workshop)

Remediation:
- Verify that report_id belongs to the calling user/mechanic.
- Use UUIDs and minimize the fields returned.

POC:
1) (Screenshot 1) NORMAL: GET mechanic_report?report_id=1 with the attacker token -> 200 (reference).
2) (Screenshot 2) EXPLOITATION + CIA: change the parameter to report_id=2 -> 200 discloses another owner's VIN and email ([REDACTED-EMAIL]).
04 / 19FAIL

Improper Inventory Management - Authentication - OTP Endpoint Versions

2 screenshots · 2 HTTP captures

Vulnerability

[FAIL] Improper Inventory Management - Authentication - OTP Endpoint Versions

Description

The OTP verification endpoint exists in several versions that are active at the same time: the older /identity/api/auth/v2/check-otp still works alongside the current v3. Retired/undocumented versions enlarge the attack surface and may enforce different security controls.

Impact

Confidentiality & Integrity: the still-live legacy version widens the attack surface; an attacker can pick the version with the weakest protection (e.g. for OTP brute force).

CWE

CWE-1059: Insufficient Technical Documentation (related to CWE-1104: Use of Unmaintained Third Party Components / legacy versions)

OWASP

API9:2023 - Improper Inventory Management

Scenario

v3 (the current version) is active. Exploitation: v2 (the legacy version) is also still active -> improper inventory (the legacy version was never decommissioned).

Endpoint

POST http://127.0.0.1:8888/identity/api/auth/v2/check-otp POST http://127.0.0.1:8888/identity/api/auth/v3/check-otp

Affected feature

Password Reset via OTP (crapi-identity)

Remediation

- Disable/retire legacy API versions (v2) that are no longer used. - Maintain an API version inventory and document the active endpoints. - Apply uniform security controls across every version still in service.

Proof of concept

1) (Screenshot 1) POST /identity/api/auth/v3/check-otp (current version) -> responds. 2) (Screenshot 2) POST /identity/api/auth/v2/check-otp (LEGACY version) -> still responds (Invalid OTP), proving the legacy version has not been decommissioned.
View source note (English)
Vulnerability: [FAIL] Improper Inventory Management - Authentication - OTP Endpoint Versions

Description:
The OTP verification endpoint exists in several versions that are active at the same time: the older /identity/api/auth/v2/check-otp still works alongside the current v3. Retired/undocumented versions enlarge the attack surface and may enforce different security controls.

Impact:
Confidentiality & Integrity: the still-live legacy version widens the attack surface; an attacker can pick the version with the weakest protection (e.g. for OTP brute force).

CWE:
CWE-1059: Insufficient Technical Documentation (related to CWE-1104: Use of Unmaintained Third Party Components / legacy versions)

OWASP:
API9:2023 - Improper Inventory Management

Scenario:
v3 (the current version) is active. Exploitation: v2 (the legacy version) is also still active -> improper inventory (the legacy version was never decommissioned).

Endpoint:
POST http://127.0.0.1:8888/identity/api/auth/v2/check-otp
POST http://127.0.0.1:8888/identity/api/auth/v3/check-otp

Affected Feature:
Password Reset via OTP (crapi-identity)

Remediation:
- Disable/retire legacy API versions (v2) that are no longer used.
- Maintain an API version inventory and document the active endpoints.
- Apply uniform security controls across every version still in service.

POC:
1) (Screenshot 1) POST /identity/api/auth/v3/check-otp (current version) -> responds.
2) (Screenshot 2) POST /identity/api/auth/v2/check-otp (LEGACY version) -> still responds (Invalid OTP), proving the legacy version has not been decommissioned.
05 / 19FAIL

JWT Signature Not Verified - Authentication - JWT Validation

5 screenshots · 3 HTTP captures · 2 process records

Vulnerability

[FAIL] JWT Signature Not Verified - Authentication - JWT Validation

Description

The crAPI identity service does not verify JWT signatures. A token with the header alg:none and no signature is accepted, and an RS256 token whose payload was modified without re-signing is also accepted. An attacker can forge a token for any user and escalate the role to admin.

Impact

Confidentiality: victim account data can be read. Integrity: identity and role (admin) can be forged -> full account takeover of every user without credentials.

CWE

CWE-347: Improper Verification of Cryptographic Signature

OWASP

API2:2023 - Broken Authentication

Scenario

Normal: a legitimate role=user token only accesses its own data. Exploitation: a forged token (alg:none / edited RS256) impersonates an ADMIN (sub=[REDACTED-EMAIL], role=admin) -> accesses the admin account (id=5) -> CIA (Confidentiality + Integrity).

Endpoint

GET http://127.0.0.1:8888/identity/api/v2/user/dashboard (all JWT-based identity endpoints)

Affected feature

JWT-based authentication (crapi-identity)

Remediation

- Verify the JWT signature with the RS256 public key on every request. - Explicitly reject alg:none and apply algorithm allow-listing (RS256 only). - Use a mature JWT library; validate exp/iss/aud.

Proof of concept

1) (Screenshot 1) NORMAL: GET /identity/api/v2/vehicle/vehicles with a legitimate RS256 token (shown in full) -> 200, own data only. 2) (Screenshot 2) alg:none PROCESS: break down the original token, base64url-decode the header and payload, change alg to 'none' with no signature and set the payload to sub=[REDACTED-EMAIL]/role=admin, then reassemble the forged token (shown in full). 3) (Screenshot 3) EXPLOITATION: send the alg:none token -> 200 returns the ADMIN account (id=5, ROLE_ADMIN). 4) (Screenshot 4) RS256 tampering PROCESS: take the original RS256 token, edit the payload to sub=[REDACTED-EMAIL] and role=admin, then reattach the OLD signature without re-signing (token shown in full). 5) (Screenshot 5) CIA IMPACT: send the tampered RS256 token -> still 200 and returns the ADMIN account -> proving the signature is not verified (Confidentiality + Integrity).
View source note (English)
Vulnerability: [FAIL] JWT Signature Not Verified - Authentication - JWT Validation

Description:
The crAPI identity service does not verify JWT signatures. A token with the header alg:none and no signature is accepted, and an RS256 token whose payload was modified without re-signing is also accepted. An attacker can forge a token for any user and escalate the role to admin.

Impact:
Confidentiality: victim account data can be read. Integrity: identity and role (admin) can be forged -> full account takeover of every user without credentials.

CWE:
CWE-347: Improper Verification of Cryptographic Signature

OWASP:
API2:2023 - Broken Authentication

Scenario:
Normal: a legitimate role=user token only accesses its own data. Exploitation: a forged token (alg:none / edited RS256) impersonates an ADMIN (sub=[REDACTED-EMAIL], role=admin) -> accesses the admin account (id=5) -> CIA (Confidentiality + Integrity).

Endpoint:
GET http://127.0.0.1:8888/identity/api/v2/user/dashboard (all JWT-based identity endpoints)

Affected Feature:
JWT-based authentication (crapi-identity)

Remediation:
- Verify the JWT signature with the RS256 public key on every request.
- Explicitly reject alg:none and apply algorithm allow-listing (RS256 only).
- Use a mature JWT library; validate exp/iss/aud.

POC:
1) (Screenshot 1) NORMAL: GET /identity/api/v2/vehicle/vehicles with a legitimate RS256 token (shown in full) -> 200, own data only.
2) (Screenshot 2) alg:none PROCESS: break down the original token, base64url-decode the header and payload, change alg to 'none' with no signature and set the payload to sub=[REDACTED-EMAIL]/role=admin, then reassemble the forged token (shown in full).
3) (Screenshot 3) EXPLOITATION: send the alg:none token -> 200 returns the ADMIN account (id=5, ROLE_ADMIN).
4) (Screenshot 4) RS256 tampering PROCESS: take the original RS256 token, edit the payload to sub=[REDACTED-EMAIL] and role=admin, then reattach the OLD signature without re-signing (token shown in full).
5) (Screenshot 5) CIA IMPACT: send the tampered RS256 token -> still 200 and returns the ADMIN account -> proving the signature is not verified (Confidentiality + Integrity).
06 / 19FAIL

NoSQL Injection - Community - Coupon Validation

3 screenshots · 3 HTTP captures

Vulnerability

[FAIL] NoSQL Injection - Community - Coupon Validation

Description

The validate-coupon endpoint passes the JSON value coupon_code straight into a MongoDB query without type sanitization. Query operators (e.g. $ne, $gt) match any coupon without knowing its code.

Impact

Confidentiality: valid coupon codes and values are disclosed. Integrity: coupon validation is bypassed, enabling discount abuse.

CWE

CWE-943: Improper Neutralization of Special Elements in Data Query Logic (NoSQL Injection)

OWASP

API8:2023 - Security Misconfiguration (Injection)

Scenario

Normal: a valid string coupon code (TRAC075) -> 200. Exploitation: coupon_code is replaced with a NoSQL operator ($ne/$gt) -> discloses coupons without knowing the code -> CIA (Confidentiality + Integrity).

Endpoint

POST http://127.0.0.1:8888/community/api/v2/coupon/validate-coupon

Affected feature

Coupon Validation (crapi-community)

Remediation

- Enforce the string type on coupon_code; reject objects/operators. - Use parameterized queries/sanitization and validate the input schema.

Proof of concept

1) (Screenshot 1) NORMAL: POST validate-coupon with the valid string coupon_code "TRAC075" -> 200. 2) (Screenshot 2) EXPLOITATION: change coupon_code to the operator {"$ne":"x"} -> 200 discloses a valid coupon without knowing its code. 3) (Screenshot 3) CIA IMPACT: the operator {"$gt":""} also discloses a coupon -> confirms NoSQL injection.
View source note (English)
Vulnerability: [FAIL] NoSQL Injection - Community - Coupon Validation

Description:
The validate-coupon endpoint passes the JSON value coupon_code straight into a MongoDB query without type sanitization. Query operators (e.g. $ne, $gt) match any coupon without knowing its code.

Impact:
Confidentiality: valid coupon codes and values are disclosed. Integrity: coupon validation is bypassed, enabling discount abuse.

CWE:
CWE-943: Improper Neutralization of Special Elements in Data Query Logic (NoSQL Injection)

OWASP:
API8:2023 - Security Misconfiguration (Injection)

Scenario:
Normal: a valid string coupon code (TRAC075) -> 200. Exploitation: coupon_code is replaced with a NoSQL operator ($ne/$gt) -> discloses coupons without knowing the code -> CIA (Confidentiality + Integrity).

Endpoint:
POST http://127.0.0.1:8888/community/api/v2/coupon/validate-coupon

Affected Feature:
Coupon Validation (crapi-community)

Remediation:
- Enforce the string type on coupon_code; reject objects/operators.
- Use parameterized queries/sanitization and validate the input schema.

POC:
1) (Screenshot 1) NORMAL: POST validate-coupon with the valid string coupon_code "TRAC075" -> 200.
2) (Screenshot 2) EXPLOITATION: change coupon_code to the operator {"$ne":"x"} -> 200 discloses a valid coupon without knowing its code.
3) (Screenshot 3) CIA IMPACT: the operator {"$gt":""} also discloses a coupon -> confirms NoSQL injection.
07 / 19FAIL

OTP Bruteforce Protection Bypass - Authentication - Password Reset

3 screenshots · 3 HTTP captures

Vulnerability

[FAIL] OTP Bruteforce Protection Bypass - Authentication - Password Reset

Description

Reset OTP verification (/v3/check-otp) locks after 9 attempts per session, BUT this limit is reset every time /forget-password is called, and that endpoint itself has no rate limit or CAPTCHA. The brute-force protection can therefore be bypassed with a repeating cycle.

Impact

Confidentiality & Integrity: account takeover (ATO) of any user whose email is known, by brute-forcing the 4-digit OTP (10,000 combinations) with no effective obstacle.

CWE

CWE-307: Improper Restriction of Excessive Authentication Attempts

OWASP

API2:2023 - Broken Authentication

Scenario

Normal: request an OTP and make one attempt (Invalid). Exploitation: repeating forget-password without limit resets the lockout -> brute-force the 4-digit OTP -> ATO -> CIA (Confidentiality + Integrity).

Endpoint

POST http://127.0.0.1:8888/identity/api/auth/v3/check-otp POST http://127.0.0.1:8888/identity/api/auth/forget-password

Affected feature

Password Reset via OTP (crapi-identity)

Remediation

- Apply PERSISTENT per-account rate limiting + lockout (not reset by a new OTP request). - Throttle and add CAPTCHA to forget-password. - Use OTPs of >=6 digits with a short expiry.

Proof of concept

1) (Screenshot 1) NORMAL: POST forget-password {victim email} -> 200, OTP sent. 2) (Screenshot 2) NORMAL: POST v3/check-otp with one wrong attempt -> Invalid OTP. 3) (Screenshot 3) EXPLOITATION + CIA: after the lockout, call forget-password again (200, no throttling) -> the counter is reset and a new OTP is issued; repeat the cycle [reset -> 9 guesses] until the OTP is guessed -> victim password reset (ATO).
View source note (English)
Vulnerability: [FAIL] OTP Bruteforce Protection Bypass - Authentication - Password Reset

Description:
Reset OTP verification (/v3/check-otp) locks after 9 attempts per session, BUT this limit is reset every time /forget-password is called, and that endpoint itself has no rate limit or CAPTCHA. The brute-force protection can therefore be bypassed with a repeating cycle.

Impact:
Confidentiality & Integrity: account takeover (ATO) of any user whose email is known, by brute-forcing the 4-digit OTP (10,000 combinations) with no effective obstacle.

CWE:
CWE-307: Improper Restriction of Excessive Authentication Attempts

OWASP:
API2:2023 - Broken Authentication

Scenario:
Normal: request an OTP and make one attempt (Invalid). Exploitation: repeating forget-password without limit resets the lockout -> brute-force the 4-digit OTP -> ATO -> CIA (Confidentiality + Integrity).

Endpoint:
POST http://127.0.0.1:8888/identity/api/auth/v3/check-otp
POST http://127.0.0.1:8888/identity/api/auth/forget-password

Affected Feature:
Password Reset via OTP (crapi-identity)

Remediation:
- Apply PERSISTENT per-account rate limiting + lockout (not reset by a new OTP request).
- Throttle and add CAPTCHA to forget-password.
- Use OTPs of >=6 digits with a short expiry.

POC:
1) (Screenshot 1) NORMAL: POST forget-password {victim email} -> 200, OTP sent.
2) (Screenshot 2) NORMAL: POST v3/check-otp with one wrong attempt -> Invalid OTP.
3) (Screenshot 3) EXPLOITATION + CIA: after the lockout, call forget-password again (200, no throttling) -> the counter is reset and a new OTP is issued; repeat the cycle [reset -> 9 guesses] until the OTP is guessed -> victim password reset (ATO).
08 / 19FAIL

Server-Side Request Forgery - Workshop - Contact Mechanic

5 screenshots · 5 HTTP captures

Vulnerability

[FAIL] Server-Side Request Forgery - Workshop - Contact Mechanic

Description

The contact_mechanic endpoint accepts a full URL in the mechanic_api parameter and performs a server-side HTTP request to that URL, then reflects the response. An attacker can point it at INTERNAL services that are not exposed publicly. Escalation: the SSRF is aimed at the internal MailHog mail server (mailhog:8025) to read every user's email, harvest the victim's password-reset OTP, and then reset the victim's password -> Account Takeover.

Impact

Confidentiality + Integrity (Critical): the SSRF reads the entire internal mailbox (mailhog, 45 emails), including other users' reset OTPs/tokens, which are then used to take over victim accounts without knowing their credentials. Applies to any account whose email is known.

CWE

CWE-918: Server-Side Request Forgery (SSRF)

OWASP

API7:2023 - Server Side Request Forgery

Scenario

Normal: mechanic_api points to a legitimate mechanic endpoint. Exploitation (chain): SSRF -> internal MailHog -> read victim email -> harvest OTP -> reset victim password -> log in as the victim (ATO). The end result demonstrates CIA (Confidentiality + Integrity).

Endpoint

POST http://127.0.0.1:8888/workshop/api/merchant/contact_mechanic

Affected feature

Contact Mechanic / mechanic API integration (crapi-workshop)

Remediation

- Do not accept full URLs from the client; use an allow-list of legitimate mechanic hosts/endpoints. - Block internal schemes and IP/host ranges (loopback, RFC1918, internal service names such as mailhog/crapi-identity). - Do not reflect raw upstream responses to the client. - Network segmentation: internal services (MailHog, actuator) must not be reachable from any service that accepts URL input.

Proof of concept

1) (Screenshot 1) NORMAL: contact_mechanic with mechanic_api set to a legitimate mechanic endpoint -> the server fetches it server-side. 2) (Screenshot 2) EXPLOITATION: mechanic_api = http://mailhog:8025/api/v2/messages -> the SSRF reads the ENTIRE internal mailbox (45 emails from all users). 3) (Screenshot 3) HARVEST: mechanic_api = http://mailhog:8025/api/v2/search?kind=to&query=[REDACTED-EMAIL] -> reads the victim's OTP email; the 4-digit OTP is harvested. 4) (Screenshot 4) CHAIN: the harvested OTP is sent to /identity/api/auth/v3/check-otp -> 'OTP verified', the victim's password is reset. 5) (Screenshot 5) CIA IMPACT: log in as the victim with the new password -> token issued -> Account Takeover.
View source note (English)
Vulnerability: [FAIL] Server-Side Request Forgery - Workshop - Contact Mechanic

Description:
The contact_mechanic endpoint accepts a full URL in the mechanic_api parameter and performs a server-side HTTP request to that URL, then reflects the response. An attacker can point it at INTERNAL services that are not exposed publicly. Escalation: the SSRF is aimed at the internal MailHog mail server (mailhog:8025) to read every user's email, harvest the victim's password-reset OTP, and then reset the victim's password -> Account Takeover.

Impact:
Confidentiality + Integrity (Critical): the SSRF reads the entire internal mailbox (mailhog, 45 emails), including other users' reset OTPs/tokens, which are then used to take over victim accounts without knowing their credentials. Applies to any account whose email is known.

CWE:
CWE-918: Server-Side Request Forgery (SSRF)

OWASP:
API7:2023 - Server Side Request Forgery

Scenario:
Normal: mechanic_api points to a legitimate mechanic endpoint. Exploitation (chain): SSRF -> internal MailHog -> read victim email -> harvest OTP -> reset victim password -> log in as the victim (ATO). The end result demonstrates CIA (Confidentiality + Integrity).

Endpoint:
POST http://127.0.0.1:8888/workshop/api/merchant/contact_mechanic

Affected Feature:
Contact Mechanic / mechanic API integration (crapi-workshop)

Remediation:
- Do not accept full URLs from the client; use an allow-list of legitimate mechanic hosts/endpoints.
- Block internal schemes and IP/host ranges (loopback, RFC1918, internal service names such as mailhog/crapi-identity).
- Do not reflect raw upstream responses to the client.
- Network segmentation: internal services (MailHog, actuator) must not be reachable from any service that accepts URL input.

POC:
1) (Screenshot 1) NORMAL: contact_mechanic with mechanic_api set to a legitimate mechanic endpoint -> the server fetches it server-side.
2) (Screenshot 2) EXPLOITATION: mechanic_api = http://mailhog:8025/api/v2/messages -> the SSRF reads the ENTIRE internal mailbox (45 emails from all users).
3) (Screenshot 3) HARVEST: mechanic_api = http://mailhog:8025/api/v2/search?kind=to&query=[REDACTED-EMAIL] -> reads the victim's OTP email; the 4-digit OTP is harvested.
4) (Screenshot 4) CHAIN: the harvested OTP is sent to /identity/api/auth/v3/check-otp -> 'OTP verified', the victim's password is reset.
5) (Screenshot 5) CIA IMPACT: log in as the victim with the new password -> token issued -> Account Takeover.
09 / 19FAIL

Unauthenticated Order Access - Shop - Order Details

2 screenshots · 2 HTTP captures

Vulnerability

[FAIL] Unauthenticated Order Access - Shop - Order Details

Description

The endpoint GET /workshop/api/shop/orders/{order_id} returns full order details without authentication, and order_id is sequential and easy to enumerate.

Impact

Confidentiality: PII for every customer (email, phone number, product, status, transaction) is disclosed to unauthenticated parties, including administrator accounts.

CWE

CWE-306: Missing Authentication for Critical Function

OWASP

API5:2023 - Broken Function Level Authorization (and API1:2023 - BOLA)

Scenario

Normal: access an order with a token -> 200. Exploitation: remove the Authorization header -> still 200 plus PII -> CIA (Confidentiality).

Endpoint

GET http://127.0.0.1:8888/workshop/api/shop/orders/{order_id}

Affected feature

Shop Order History/Details (crapi-workshop)

Remediation

- Require authentication plus ownership verification (order.user == caller). - Use non-sequential identifiers (UUIDs). - Apply centralized authorization.

Proof of concept

1) (Screenshot 1) NORMAL: GET /workshop/api/shop/orders/5 with a valid Authorization header -> 200. 2) (Screenshot 2) EXPLOITATION + CIA: resend the same request WITHOUT the Authorization header -> still 200 and discloses the order owner's PII ([REDACTED-EMAIL]).
View source note (English)
Vulnerability: [FAIL] Unauthenticated Order Access - Shop - Order Details

Description:
The endpoint GET /workshop/api/shop/orders/{order_id} returns full order details without authentication, and order_id is sequential and easy to enumerate.

Impact:
Confidentiality: PII for every customer (email, phone number, product, status, transaction) is disclosed to unauthenticated parties, including administrator accounts.

CWE:
CWE-306: Missing Authentication for Critical Function

OWASP:
API5:2023 - Broken Function Level Authorization (and API1:2023 - BOLA)

Scenario:
Normal: access an order with a token -> 200. Exploitation: remove the Authorization header -> still 200 plus PII -> CIA (Confidentiality).

Endpoint:
GET http://127.0.0.1:8888/workshop/api/shop/orders/{order_id}

Affected Feature:
Shop Order History/Details (crapi-workshop)

Remediation:
- Require authentication plus ownership verification (order.user == caller).
- Use non-sequential identifiers (UUIDs).
- Apply centralized authorization.

POC:
1) (Screenshot 1) NORMAL: GET /workshop/api/shop/orders/5 with a valid Authorization header -> 200.
2) (Screenshot 2) EXPLOITATION + CIA: resend the same request WITHOUT the Authorization header -> still 200 and discloses the order owner's PII ([REDACTED-EMAIL]).
10 / 19FAIL

Unrestricted Resource Consumption - Authentication - Login Rate Limiting

2 screenshots · 2 HTTP captures

Vulnerability

[FAIL] Unrestricted Resource Consumption - Authentication - Login Rate Limiting

Description

The crAPI login endpoint applies neither rate limiting nor account lockout. Repeated failed login attempts are not limited, enabling brute force/credential stuffing and unbounded consumption of server resources.

Impact

Availability: the server can be flooded with authentication requests without restriction. Confidentiality: enables credential brute force to take over accounts.

CWE

CWE-307: Improper Restriction of Excessive Authentication Attempts (CWE-770: Allocation of Resources Without Limits)

OWASP

API4:2023 - Unrestricted Resource Consumption

Scenario

Normal: a single failed login -> 401. Exploitation: 20 consecutive attempts -> all 401 with no 429/lockout, proving there is no restriction.

Endpoint

POST http://127.0.0.1:8888/identity/api/auth/login

Affected feature

Login Authentication (crapi-identity)

Remediation

- Apply per-account/IP rate limiting and progressive account lockout. - Add CAPTCHA/anti-automation and anomaly detection. - Limit concurrency/requests per client.

Proof of concept

1) (Screenshot 1) NORMAL: POST /identity/api/auth/login with a wrong password -> 401. 2) (Screenshot 2) EXPLOITATION: send 20 consecutive login attempts -> all 401 with no HTTP 429/lockout, proving there is no rate limiting.
View source note (English)
Vulnerability: [FAIL] Unrestricted Resource Consumption - Authentication - Login Rate Limiting

Description:
The crAPI login endpoint applies neither rate limiting nor account lockout. Repeated failed login attempts are not limited, enabling brute force/credential stuffing and unbounded consumption of server resources.

Impact:
Availability: the server can be flooded with authentication requests without restriction. Confidentiality: enables credential brute force to take over accounts.

CWE:
CWE-307: Improper Restriction of Excessive Authentication Attempts (CWE-770: Allocation of Resources Without Limits)

OWASP:
API4:2023 - Unrestricted Resource Consumption

Scenario:
Normal: a single failed login -> 401. Exploitation: 20 consecutive attempts -> all 401 with no 429/lockout, proving there is no restriction.

Endpoint:
POST http://127.0.0.1:8888/identity/api/auth/login

Affected Feature:
Login Authentication (crapi-identity)

Remediation:
- Apply per-account/IP rate limiting and progressive account lockout.
- Add CAPTCHA/anti-automation and anomaly detection.
- Limit concurrency/requests per client.

POC:
1) (Screenshot 1) NORMAL: POST /identity/api/auth/login with a wrong password -> 401.
2) (Screenshot 2) EXPLOITATION: send 20 consecutive login attempts -> all 401 with no HTTP 429/lockout, proving there is no rate limiting.
11 / 19FAIL

Unsafe Consumption of APIs - Workshop - Contact Mechanic Upstream

2 screenshots · 2 HTTP captures

Vulnerability

[FAIL] Unsafe Consumption of APIs - Workshop - Contact Mechanic Upstream

Description

The contact_mechanic endpoint consumes the response from the mechanic API (a client-controlled URL) and reflects it back to the user without validating or filtering its structure or content. The application implicitly trusts data from the upstream API.

Impact

Confidentiality & Integrity: untrusted upstream data (which the attacker can control) is reflected/processed as-is; this can be used to exfiltrate internal responses or inject content the application trusts.

CWE

CWE-20: Improper Input Validation (related to CWE-345: Insufficient Verification of Data Authenticity)

OWASP

API10:2023 - Unsafe Consumption of APIs

Scenario

Normal: the workshop consumes a legitimate mechanic API. Exploitation: the upstream URL is swapped for an arbitrary one -> the raw response is reflected without validation.

Endpoint

POST http://127.0.0.1:8888/workshop/api/merchant/contact_mechanic

Affected feature

Contact Mechanic / mechanic API integration (crapi-workshop)

Remediation

- Validate and filter upstream responses (schema, content type) before processing/reflecting them. - Restrict upstream destinations to a trusted allow-list (see also the SSRF finding). - Do not reflect raw responses to the client.

Proof of concept

1) (Screenshot 1) NORMAL: contact_mechanic consumes the mechanic API and includes its response. 2) (Screenshot 2) EXPLOITATION: change mechanic_api to an arbitrary URL -> the workshop reflects the raw upstream response without validation (unsafe consumption).
View source note (English)
Vulnerability: [FAIL] Unsafe Consumption of APIs - Workshop - Contact Mechanic Upstream

Description:
The contact_mechanic endpoint consumes the response from the mechanic API (a client-controlled URL) and reflects it back to the user without validating or filtering its structure or content. The application implicitly trusts data from the upstream API.

Impact:
Confidentiality & Integrity: untrusted upstream data (which the attacker can control) is reflected/processed as-is; this can be used to exfiltrate internal responses or inject content the application trusts.

CWE:
CWE-20: Improper Input Validation (related to CWE-345: Insufficient Verification of Data Authenticity)

OWASP:
API10:2023 - Unsafe Consumption of APIs

Scenario:
Normal: the workshop consumes a legitimate mechanic API. Exploitation: the upstream URL is swapped for an arbitrary one -> the raw response is reflected without validation.

Endpoint:
POST http://127.0.0.1:8888/workshop/api/merchant/contact_mechanic

Affected Feature:
Contact Mechanic / mechanic API integration (crapi-workshop)

Remediation:
- Validate and filter upstream responses (schema, content type) before processing/reflecting them.
- Restrict upstream destinations to a trusted allow-list (see also the SSRF finding).
- Do not reflect raw responses to the client.

POC:
1) (Screenshot 1) NORMAL: contact_mechanic consumes the mechanic API and includes its response.
2) (Screenshot 2) EXPLOITATION: change mechanic_api to an arbitrary URL -> the workshop reflects the raw upstream response without validation (unsafe consumption).
12 / 19PASS

Broken Access Control - Login - CSRF Token Cookie Binding

5 screenshots · 0 HTTP captures

No written note is available for this test case. Any available screenshots or HTTP captures are shown below.

13 / 19PASS

Broken Object Level Authorization - Shop - Return Order

1 screenshots · 1 HTTP captures

Vulnerability

[PASS] Broken Object Level Authorization - Shop - Return Order

Description

Tested whether the order return action (return_order) is vulnerable to BOLA by attempting to return an order belonging to another user.

Impact

No impact: the server enforces ownership authorization and rejects the request (403).

CWE

CWE-639: Authorization Bypass Through User-Controlled Key (tested, not vulnerable)

OWASP

API1:2023 - Broken Object Level Authorization (negative test)

Scenario

Exploitation: return_order?order_id=1 (not owned by the attacker) -> 403. PASS (control holds, CIA not violated).

Endpoint

POST http://127.0.0.1:8888/workshop/api/shop/orders/return_order?order_id={id}

Affected feature

Order Return (crapi-workshop)

Remediation

Keep the ownership check on the return action (the current state is correct).

Proof of concept

1) (Screenshot 1) EXPLOITATION: POST return_order?order_id=1 (an order owned by another user) with the attacker token -> 403 "You are not allowed to access this resource!" (control holds).
View source note (English)
Vulnerability: [PASS] Broken Object Level Authorization - Shop - Return Order

Description:
Tested whether the order return action (return_order) is vulnerable to BOLA by attempting to return an order belonging to another user.

Impact:
No impact: the server enforces ownership authorization and rejects the request (403).

CWE:
CWE-639: Authorization Bypass Through User-Controlled Key (tested, not vulnerable)

OWASP:
API1:2023 - Broken Object Level Authorization (negative test)

Scenario:
Exploitation: return_order?order_id=1 (not owned by the attacker) -> 403. PASS (control holds, CIA not violated).

Endpoint:
POST http://127.0.0.1:8888/workshop/api/shop/orders/return_order?order_id={id}

Affected Feature:
Order Return (crapi-workshop)

Remediation:
Keep the ownership check on the return action (the current state is correct).

POC:
1) (Screenshot 1) EXPLOITATION: POST return_order?order_id=1 (an order owned by another user) with the attacker token -> 403 "You are not allowed to access this resource!" (control holds).
14 / 19PASS

Broken Object Level Authorization - Vehicle - Location Tracking (Unauthenticated)

2 screenshots · 2 HTTP captures

Vulnerability

[PASS] Broken Object Level Authorization - Vehicle - Location Tracking (Unauthenticated)

Description

Tested access to the vehicle location endpoint without any authentication.

Impact

No impact: the server requires authentication and rejects the request (401).

CWE

CWE-306: Missing Authentication for Critical Function (tested, not vulnerable on this path)

OWASP

API1:2023 - Broken Object Level Authorization (negative test - unauthenticated path)

Scenario

Normal: access your own location with a token -> 200. Exploitation: remove the token -> 401. PASS (authentication control holds).

Endpoint

GET http://127.0.0.1:8888/identity/api/v2/vehicle/{vehicleId}/location

Affected feature

Vehicle Location Tracking (crapi-identity)

Remediation

Keep the authentication requirement; additionally add object ownership verification (see the related [FAIL] finding).

Proof of concept

1) (Screenshot 1) NORMAL: GET /identity/api/v2/vehicle/9b3ce26b-d797-404b-a961-09d7e45e0d1b/location for your own vehicle with a token -> 200. 2) (Screenshot 2) EXPLOITATION: resend WITHOUT the Authorization header -> 401 (authentication control holds).
View source note (English)
Vulnerability: [PASS] Broken Object Level Authorization - Vehicle - Location Tracking (Unauthenticated)

Description:
Tested access to the vehicle location endpoint without any authentication.

Impact:
No impact: the server requires authentication and rejects the request (401).

CWE:
CWE-306: Missing Authentication for Critical Function (tested, not vulnerable on this path)

OWASP:
API1:2023 - Broken Object Level Authorization (negative test - unauthenticated path)

Scenario:
Normal: access your own location with a token -> 200. Exploitation: remove the token -> 401. PASS (authentication control holds).

Endpoint:
GET http://127.0.0.1:8888/identity/api/v2/vehicle/{vehicleId}/location

Affected Feature:
Vehicle Location Tracking (crapi-identity)

Remediation:
Keep the authentication requirement; additionally add object ownership verification (see the related [FAIL] finding).

POC:
1) (Screenshot 1) NORMAL: GET /identity/api/v2/vehicle/9b3ce26b-d797-404b-a961-09d7e45e0d1b/location for your own vehicle with a token -> 200.
2) (Screenshot 2) EXPLOITATION: resend WITHOUT the Authorization header -> 401 (authentication control holds).
15 / 19PASS

Broken Object Level Authorization - Workshop - Mechanic Report (Unauthenticated)

2 screenshots · 2 HTTP captures

Vulnerability

[PASS] Broken Object Level Authorization - Workshop - Mechanic Report (Unauthenticated)

Description

Tested access to the mechanic_report endpoint without authentication.

Impact

No impact: the server requires authentication and rejects the request (401).

CWE

CWE-306: Missing Authentication for Critical Function (tested, not vulnerable on this path)

OWASP

API1:2023 - Broken Object Level Authorization (negative test - unauthenticated path)

Scenario

Normal: read a report with a token -> 200. Exploitation: remove the token -> 401. PASS (authentication control holds).

Endpoint

GET http://127.0.0.1:8888/workshop/api/mechanic/mechanic_report?report_id={id}

Affected feature

Mechanic Service Report (crapi-workshop)

Remediation

Keep the authentication requirement; add object ownership verification (see the related [FAIL] finding).

Proof of concept

1) (Screenshot 1) NORMAL: GET mechanic_report?report_id=1 with a token -> 200. 2) (Screenshot 2) EXPLOITATION: resend WITHOUT the Authorization header -> 401 (authentication control holds).
View source note (English)
Vulnerability: [PASS] Broken Object Level Authorization - Workshop - Mechanic Report (Unauthenticated)

Description:
Tested access to the mechanic_report endpoint without authentication.

Impact:
No impact: the server requires authentication and rejects the request (401).

CWE:
CWE-306: Missing Authentication for Critical Function (tested, not vulnerable on this path)

OWASP:
API1:2023 - Broken Object Level Authorization (negative test - unauthenticated path)

Scenario:
Normal: read a report with a token -> 200. Exploitation: remove the token -> 401. PASS (authentication control holds).

Endpoint:
GET http://127.0.0.1:8888/workshop/api/mechanic/mechanic_report?report_id={id}

Affected Feature:
Mechanic Service Report (crapi-workshop)

Remediation:
Keep the authentication requirement; add object ownership verification (see the related [FAIL] finding).

POC:
1) (Screenshot 1) NORMAL: GET mechanic_report?report_id=1 with a token -> 200.
2) (Screenshot 2) EXPLOITATION: resend WITHOUT the Authorization header -> 401 (authentication control holds).
16 / 19PASS

Mass Assignment - Authentication - User Registration

3 screenshots · 3 HTTP captures

Vulnerability

[PASS] Mass Assignment - Authentication - User Registration

Description

Tested whether the registration endpoint is vulnerable to mass assignment by injecting privileged fields (role=admin, isAdmin=true) into the signup body.

Impact

No impact: the server ignores privileged fields, so no privilege escalation occurs.

CWE

CWE-915: Improperly Controlled Modification of Dynamically-Determined Object Attributes (tested, not vulnerable)

OWASP

API3:2023 - Broken Object Property Level Authorization (negative test)

Scenario

Normal: standard registration. Exploitation: signup + role=admin/isAdmin. Result: login shows the role remains user -> PASS (control holds, CIA not violated).

Endpoint

POST http://127.0.0.1:8888/identity/api/auth/signup

Affected feature

User Registration (crapi-identity)

Remediation

Keep the allow-list of fields the client may set during registration (the current state is correct).

Proof of concept

1) (Screenshot 1) NORMAL: signup with standard fields -> 200. 2) (Screenshot 2) EXPLOITATION: signup with the addition of role=admin & isAdmin=true -> 200 (registered). 3) (Screenshot 3) RESULT: log in to that account -> the JWT role remains "user" -> privileged fields were ignored (control holds).
View source note (English)
Vulnerability: [PASS] Mass Assignment - Authentication - User Registration

Description:
Tested whether the registration endpoint is vulnerable to mass assignment by injecting privileged fields (role=admin, isAdmin=true) into the signup body.

Impact:
No impact: the server ignores privileged fields, so no privilege escalation occurs.

CWE:
CWE-915: Improperly Controlled Modification of Dynamically-Determined Object Attributes (tested, not vulnerable)

OWASP:
API3:2023 - Broken Object Property Level Authorization (negative test)

Scenario:
Normal: standard registration. Exploitation: signup + role=admin/isAdmin. Result: login shows the role remains user -> PASS (control holds, CIA not violated).

Endpoint:
POST http://127.0.0.1:8888/identity/api/auth/signup

Affected Feature:
User Registration (crapi-identity)

Remediation:
Keep the allow-list of fields the client may set during registration (the current state is correct).

POC:
1) (Screenshot 1) NORMAL: signup with standard fields -> 200.
2) (Screenshot 2) EXPLOITATION: signup with the addition of role=admin & isAdmin=true -> 200 (registered).
3) (Screenshot 3) RESULT: log in to that account -> the JWT role remains "user" -> privileged fields were ignored (control holds).
17 / 19PASS

NoSQL Injection - Community - Coupon Validation (Normal Input)

2 screenshots · 2 HTTP captures

Vulnerability

[PASS] NoSQL Injection - Community - Coupon Validation (Normal Input)

Description

Tested coupon validation with ordinary string input (valid and unknown), without NoSQL operators.

Impact

No impact: valid codes are accepted and unknown codes are rejected as expected.

CWE

CWE-943: NoSQL Injection (negative test for ordinary string input)

OWASP

API8:2023 - Security Misconfiguration (negative test - normal input)

Scenario

Normal: valid code TRAC075 -> 200. Test: unknown random string -> rejected. PASS (normal input validation holds). Operator injection is covered in [FAIL].

Endpoint

POST http://127.0.0.1:8888/community/api/v2/coupon/validate-coupon

Affected feature

Coupon Validation (crapi-community)

Remediation

Enforce the string type and reject operators/objects (see the related [FAIL] finding).

Proof of concept

1) (Screenshot 1) NORMAL: coupon_code="TRAC075" (valid) -> 200. 2) (Screenshot 2) TEST: coupon_code="INVALID_RANDOM_XYZ" (unknown string) -> rejected (normal validation holds).
View source note (English)
Vulnerability: [PASS] NoSQL Injection - Community - Coupon Validation (Normal Input)

Description:
Tested coupon validation with ordinary string input (valid and unknown), without NoSQL operators.

Impact:
No impact: valid codes are accepted and unknown codes are rejected as expected.

CWE:
CWE-943: NoSQL Injection (negative test for ordinary string input)

OWASP:
API8:2023 - Security Misconfiguration (negative test - normal input)

Scenario:
Normal: valid code TRAC075 -> 200. Test: unknown random string -> rejected. PASS (normal input validation holds). Operator injection is covered in [FAIL].

Endpoint:
POST http://127.0.0.1:8888/community/api/v2/coupon/validate-coupon

Affected Feature:
Coupon Validation (crapi-community)

Remediation:
Enforce the string type and reject operators/objects (see the related [FAIL] finding).

POC:
1) (Screenshot 1) NORMAL: coupon_code="TRAC075" (valid) -> 200.
2) (Screenshot 2) TEST: coupon_code="INVALID_RANDOM_XYZ" (unknown string) -> rejected (normal validation holds).
18 / 19PASS

OTP Bruteforce Protection - Authentication - Password Reset (Per-Session Lockout)

2 screenshots · 2 HTTP captures

Vulnerability

[PASS] OTP Bruteforce Protection - Authentication - Password Reset (Per-Session Lockout)

Description

Tested OTP brute force within a single OTP session without requesting a new OTP.

Impact

No impact on this path: lockout triggers after 9 attempts (HTTP 503), so per-session brute force fails.

CWE

CWE-307: Improper Restriction of Excessive Authentication Attempts (per-session control PRESENT)

OWASP

API2:2023 - Broken Authentication (negative test - per-session path)

Scenario

Normal: one OTP attempt -> Invalid. Exploitation: brute force -> lockout 503 after 9 attempts. PASS (per-session control holds). The bypass is covered in [FAIL].

Endpoint

POST http://127.0.0.1:8888/identity/api/auth/v3/check-otp

Affected feature

Password Reset via OTP (crapi-identity)

Remediation

Make the lockout PERSISTENT per account so it cannot be reset by a new OTP request (see the related [FAIL] finding).

Proof of concept

1) (Screenshot 1) NORMAL: POST v3/check-otp with one wrong attempt -> Invalid OTP. 2) (Screenshot 2) EXPLOITATION: repeat attempts; on the 10th attempt the lockout triggers -> 503 "You've exceeded the number of attempts" (per-session control holds).
View source note (English)
Vulnerability: [PASS] OTP Bruteforce Protection - Authentication - Password Reset (Per-Session Lockout)

Description:
Tested OTP brute force within a single OTP session without requesting a new OTP.

Impact:
No impact on this path: lockout triggers after 9 attempts (HTTP 503), so per-session brute force fails.

CWE:
CWE-307: Improper Restriction of Excessive Authentication Attempts (per-session control PRESENT)

OWASP:
API2:2023 - Broken Authentication (negative test - per-session path)

Scenario:
Normal: one OTP attempt -> Invalid. Exploitation: brute force -> lockout 503 after 9 attempts. PASS (per-session control holds). The bypass is covered in [FAIL].

Endpoint:
POST http://127.0.0.1:8888/identity/api/auth/v3/check-otp

Affected Feature:
Password Reset via OTP (crapi-identity)

Remediation:
Make the lockout PERSISTENT per account so it cannot be reset by a new OTP request (see the related [FAIL] finding).

POC:
1) (Screenshot 1) NORMAL: POST v3/check-otp with one wrong attempt -> Invalid OTP.
2) (Screenshot 2) EXPLOITATION: repeat attempts; on the 10th attempt the lockout triggers -> 503 "You've exceeded the number of attempts" (per-session control holds).
19 / 19PASS

Unrestricted Access to Sensitive Business Flow - Shop - Coupon Claim

2 screenshots · 2 HTTP captures

Vulnerability

[PASS] Unrestricted Access to Sensitive Business Flow - Shop - Coupon Claim

Description

Tested whether a sensitive business flow (claiming a coupon to top up the balance) can be abused by claiming the same coupon repeatedly (replay).

Impact

No impact: the server rejects a second claim of the same coupon (already claimed); the business flow is limited per user.

CWE

CWE-837: Improper Enforcement of a Single, Unique Action (tested, not vulnerable)

OWASP

API6:2023 - Unrestricted Access to Sensitive Business Flows (negative test)

Scenario

Normal: the first coupon claim succeeds (balance +75). Exploitation: replay the same coupon -> rejected (already claimed). PASS (control holds).

Endpoint

POST http://127.0.0.1:8888/workshop/api/shop/apply_coupon

Affected feature

Coupon Claim / Balance (crapi-workshop)

Remediation

Keep the per-user coupon claim restriction (the current state is correct).

Proof of concept

1) (Screenshot 1) NORMAL: apply_coupon TRAC075 for the first time -> succeeds, balance increases. 2) (Screenshot 2) EXPLOITATION: apply_coupon TRAC075 again -> rejected 'already claimed' (control holds).
View source note (English)
Vulnerability: [PASS] Unrestricted Access to Sensitive Business Flow - Shop - Coupon Claim

Description:
Tested whether a sensitive business flow (claiming a coupon to top up the balance) can be abused by claiming the same coupon repeatedly (replay).

Impact:
No impact: the server rejects a second claim of the same coupon (already claimed); the business flow is limited per user.

CWE:
CWE-837: Improper Enforcement of a Single, Unique Action (tested, not vulnerable)

OWASP:
API6:2023 - Unrestricted Access to Sensitive Business Flows (negative test)

Scenario:
Normal: the first coupon claim succeeds (balance +75). Exploitation: replay the same coupon -> rejected (already claimed). PASS (control holds).

Endpoint:
POST http://127.0.0.1:8888/workshop/api/shop/apply_coupon

Affected Feature:
Coupon Claim / Balance (crapi-workshop)

Remediation:
Keep the per-user coupon claim restriction (the current state is correct).

POC:
1) (Screenshot 1) NORMAL: apply_coupon TRAC075 for the first time -> succeeds, balance increases.
2) (Screenshot 2) EXPLOITATION: apply_coupon TRAC075 again -> rejected 'already claimed' (control holds).
04 / ORIGINAL DOCUMENT

Original PDF report

Read the original PDF below, or open it in a new tab.

If the PDF does not display: Open PDF (EN) ↗

The HTML report presents the test notes and supporting material, not a word-for-word copy of the PDF. Refer to the PDF for the original report and layout.