Your lab skills
The weakness classes and CWEs you have practiced in the browser labs, from the progress kept on this device, with the next lab one level up.
Built from the labs you mark complete in this browser. Nothing is sent anywhere, and this page is a study aid, not a certificate. Export or import your progress on Learning paths.
Next labs
Start with a Foundation lab in any class, then move one level up in the classes you know.
- CSRF lab: Protect an account change from a forged request (Foundation, JavaScript)
- SBOM completeness lab: Find the dependencies missing from a release SBOM (Foundation, JavaScript)
- XSS lab: Render a model’s answer as text instead of active markup (Foundation, JavaScript)
- IDOR lab: Repair an invoice authorization bug (Foundation, JavaScript)
- CORS policy lab: Grant CORS to the right origins only (Foundation, JavaScript)
- SQL injection lab: Separate SQL structure from data with sqlite3 (Foundation, Python)
- Open redirect lab: Return users to this site only (Foundation, JavaScript)
- Mass assignment lab: Update only the fields users may edit (Foundation, JavaScript)
Access control
4 labsWeaknesses: CWE-285, CWE-639, CWE-862, CWE-915
- FoundationIDOR lab: Repair an invoice authorization bugCompleted
- FoundationMass assignment lab: Update only the fields users may editCompleted
- PractitionerRAG access control lab: Stop a retriever from returning another tenant’s documentsCompleted
- AdvancedExcessive agency lab: Bind an agent’s action to the approved argumentsCompleted
Browser policy
3 labsWeaknesses: CWE-352, CWE-942, CWE-1021
- FoundationCSRF lab: Protect an account change from a forged requestCompleted
- FoundationCORS policy lab: Grant CORS to the right origins onlyCompleted
- PractitionerCSP builder lab: Build a strict Content-Security-PolicyCompleted
Cross-site scripting
2 labsWeaknesses: CWE-79
- FoundationXSS lab: Render a model’s answer as text instead of active markupCompleted
- PractitionerHTML sanitization lab: Configure a sanitizer for user commentsCompleted
Injection
3 labsWeaknesses: CWE-78, CWE-88, CWE-89, CWE-94
- FoundationSQL injection lab: Separate SQL structure from data with sqlite3Completed
- PractitionerActions injection lab: Flag GitHub Actions expression injectionCompleted
- PractitionerOS command injection lab: Run git without a shellCompleted
Path traversal
2 labsWeaknesses: CWE-22
- PractitionerPath traversal lab: Keep archive entries inside their extraction directoryCompleted
- PractitionerPath traversal lab: Serve an uploaded file without path traversalCompleted
SSRF
2 labsWeaknesses: CWE-918
- PractitionerSSRF validation lab: Validate a fetch URL with ipaddressCompleted
- AdvancedSSRF lab: Guard an outbound fetch against SSRFCompleted
Business logic and race condition
3 labsWeaknesses: CWE-362, CWE-367, CWE-472, CWE-640, CWE-837, CWE-1284
- PractitionerRace condition lab: Repair a balance check that racesCompleted
- PractitionerPassword reset token lab: Make a recovery credential single-useCompleted
- PractitionerBusiness logic lab: Price an order without trusting the clientCompleted
Token validation
2 labs- PractitionerJWT validation lab: Validate the purpose and audience of a tokenCompleted
- AdvancedJWT verification lab: Verify a JWT before trusting itCompleted
Cryptographic integrity
2 labsSupply chain and release evidence
3 labs- FoundationSBOM completeness lab: Find the dependencies missing from a release SBOMCompleted
- PractitionerSigned artifact provenance lab: Reject a release from the wrong producerCompleted
- AdvancedRelease evidence lab: Keep stale test evidence out of a release decisionCompleted
Workload configuration
2 labsWeaknesses: CWE-250, CWE-284, CWE-668
- PractitionerPrivileged container lab: Reject a privileged workload before deploymentCompleted
- PractitionerNetworkPolicy lab: Lock down a shop namespaceCompleted
File upload
1 labWeaknesses: CWE-73, CWE-434, CWE-646, CWE-770
- PractitionerFile upload lab: Accept avatars without publishing pagesCompleted
Redirect and callback validation
2 labs- FoundationOpen redirect lab: Return users to this site onlyCompleted
- AdvancedOAuth redirect and PKCE lab: Match redirect URIs and verify PKCECompleted
Randomness and token generation
1 labWeaknesses: CWE-330, CWE-331, CWE-338
- PractitionerInsecure randomness lab: Generate unguessable API keysCompleted
Memory safety
1 lab- PractitionerBuffer over-read lab: Stop a heartbeat over-readCompleted
Template injection
1 labWeaknesses: CWE-94, CWE-95, CWE-1336
- PractitionerSSTI lab: Render a welcome banner without template injectionCompleted
XXE
1 lab- PractitionerXXE lab: Parse an uploaded invoice without resolving external entitiesCompleted
Insecure deserialization
1 labWeaknesses: CWE-502
- PractitionerPickle deserialization lab: Load a session token without pickleCompleted
Password hashing
1 labWeaknesses: CWE-327, CWE-759, CWE-916
- PractitionerPassword hashing lab: Verify and upgrade an Argon2 password hash on loginCompleted
Cloud IAM
1 lab- PractitionerIAM trust policy lab: Evaluate a role trust policy against the confused deputyCompleted
Review what you learned
Seven and thirty days after you complete a lab, its lab page can ask its knowledge checks again: which test case catches a plausible wrong fix. This is off unless you turn it on, and it counts from the day you mark a lab complete in this browser.
Reviews need JavaScript and browser storage.
Mystery labs
A mystery lab hides its name, class and hints until you name the weakness. Start one from the labs index.