PortSwigger Progress

Live tracker for my pass through the PortSwigger Web Security Academy — current status and links to writeups as they land.

PortSwigger Progress

Live tracker for my pass through the PortSwigger Web Security Academy. Lab ordering follows onyxwizard’s roadmap, and the reasoning behind that choice is in Episode #2.

This page updates as I go. Writeup links fill in progressively — not every lab gets one (the trivial Apprentice ones often don’t), but anything that taught me something non-obvious will.

Legend

SymbolMeaning
Pwned
🟡In progress
Not started
📝Writeup published
No writeup planned

Overall progress

DifficultyLabsDone%
Apprentice3600%
Practitioner9700%
Expert1900%
Total15200%

1. SQL Injection — 0 / 18

2. Cross-Site Scripting (XSS) — 0 / 30

LabStatusWriteup
Reflected XSS into HTML context with nothing encoded
Stored XSS into HTML context with nothing encoded
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
Reflected XSS into attribute with angle brackets HTML-encoded
Stored XSS into anchor href attribute with double quotes HTML-encoded
Reflected XSS into a JavaScript string with angle brackets HTML encoded
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
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
Stored XSS into onclick event with angle brackets and double quotes HTML-encoded and single quotes and backslash escaped
Reflected XSS into a template literal with angle brackets, single, double quotes, backslash and backticks Unicode-escaped
Exploiting cross-site scripting to steal cookies
Exploiting cross-site scripting to capture passwords
Exploiting XSS to bypass CSRF defenses
Reflected XSS with AngularJS sandbox escape without strings
Reflected XSS with AngularJS sandbox escape and CSP
Reflected XSS with event handlers and href attributes blocked
Reflected XSS in a JavaScript URL with some characters blocked
Reflected XSS protected by very strict CSP, with dangling markup attack
Reflected XSS protected by CSP, with CSP bypass

3. CSRF — 0 / 12

4. Clickjacking — 0 / 5

5. DOM-based Vulnerabilities — 0 / 7

6. CORS — 0 / 3

7. XXE Injection — 0 / 9

8. SSRF — 0 / 7

9. HTTP Request Smuggling — 0 / 22

10. OS Command Injection — 0 / 5

11. Server-Side Template Injection — 0 / 7

12. Path Traversal — 0 / 6

13. Access Control — 0 / 13

14. Authentication — 0 / 14

15. WebSockets — 0 / 3

16. Web Cache Poisoning — 0 / 13

17. Insecure Deserialization — 0 / 10

18. Information Disclosure — 0 / 5

19. Business Logic — 0 / 12

20. HTTP Host Header Attacks — 0 / 7

21. OAuth Authentication — 0 / 6

22. File Upload Vulnerabilities — 0 / 7

23. JWT Attacks — 0 / 8

24. Essential Skills — 0 / 2

25. Prototype Pollution — 0 / 10

26. GraphQL API Vulnerabilities — 0 / 5

27. Race Conditions — 0 / 6

28. NoSQL Injection — 0 / 4

29. API Testing — 0 / 5

30. Web LLM Attacks — 0 / 8

31. Web Cache Deception — 0 / 5


Last updated: 2026-04-20. Lab data and ordering follow onyxwizard/portswigger-academy under MIT License.

This post is licensed under CC BY 4.0 by the author.