Authorization disclaimer. This walkthrough is limited to the intentionally vulnerable PortSwigger Web Security Academy lab linked below. Test only systems you own or are explicitly authorized to assess.
Overview
This lab isolates Canonical-link attribute injection. The raw query string is reflected into the href of a canonical link element in the document head; angle brackets cannot create a new tag. The injected accesskey makes the otherwise hidden link activatable; the victim presses Alt+Shift+X on Chrome/Windows (Ctrl+Alt+X on macOS).
Lab objective/setup
Open the Academy exercise at the reserved lab URL and work only in that disposable environment. The required proof is specific: The keyboard shortcut dispatches the injected click handler and displays the alert.
What I observed
The raw query string is reflected into the href of a canonical link element in the document head; angle brackets cannot create a new tag. The injected accesskey makes the otherwise hidden link activatable; the victim presses Alt+Shift+X on Chrome/Windows (Ctrl+Alt+X on macOS).

Why it is vulnerable
The application applies protection for the wrong parser or omits a control at the decisive boundary. In this case, the raw query string is reflected into the href of a canonical link element in the document head; angle brackets cannot create a new tag. Browser parsing therefore preserves the attacker-controlled behavior instead of reducing the value to inert text or a safe URL.
Walkthrough in the authorized PortSwigger lab
First reproduce the recorded page or request and inspect the exact reflected, stored, or DOM-generated context described above. Then supply the following lab payload as data, not as active markup in this article:
1 | `/?'accesskey='x'onclick='alert(1)` |
The injected accesskey makes the otherwise hidden link activatable; the victim presses Alt+Shift+X on Chrome/Windows (Ctrl+Alt+X on macOS).

Verification
The keyboard shortcut dispatches the injected click handler and displays the alert. This distinguishes execution from a payload merely appearing in source or being stored without reaching the required event or sink.
Impact and defensive lesson
In a real application, equivalent XSS could act with the victim’s same-origin privileges, expose readable data, or perform authenticated actions. Fix the data flow at its context: use text-only DOM APIs, JavaScript- or attribute-aware encoding, strict URL-scheme allowlists, and maintained sanitization where HTML is unavoidable. HttpOnly cookies and a restrictive CSP reduce consequences but do not repair the injection flaw.