SSRF (Server-Side Request Forgery) is a vulnerability where an attacker can make the server perform HTTP requests to targets the attacker chooses. That can mean hitting internal services, cloud metadata endpoints, or exfiltrating data — and blind SSRF still matters because you can detect it out-of-band.
Two types: Regular SSRF (response is reflected) vs Blind SSRF (no response; confirm via external logger).
Definition: forcing the web server to make an additional or modified request to a resource of the attacker’s choosing.
High-signal target: cloud metadata at 169.254.169.254 (often blocked; bypasses exist).
SSRF usually shows up anywhere the app “fetches” something for you:
?url=https://example.com/image.pngsrv=filestorage.cloud.thm&port=8001?path=/avatar/1.pngBlind SSRF: use an external HTTP logger (requestbin / your own server / Burp Collaborator) to see inbound hits.
Deny lists block “bad” hosts like localhost, 127.0.0.1, or metadata IPs. Bypasses often use alternate representations.
127.1, 0, 0.0.0.0, 2130706433, etc.127.0.0.1 (e.g. 127.0.0.1.nip.io)169.254.169.254 (also bypassable via DNS tricks)Allow lists only allow URLs that match a pattern like https://website.thm. A classic bypass is a subdomain trick:
https://website.thm.attacker-domain.thm
If the app only allows URLs starting with the target domain, an open redirect endpoint on that domain can bounce the server-side request to your real target.
Example concept: /link?url=https://tryhackme.com used to redirect the internal request.
TryHackMe’s scenario uses an avatar selection feature where the server fetches a resource based on a form value.
/private)# bypass example from the room
avatar = x/../private
Because ../ normalizes paths, x/../private becomes /private server-side and can bypass naive “starts with /private” checks.
Flag flow: the response gets embedded as a data: URI and base64 encoded — decode it to recover the flag.
169.254.169.254).x/../ when simple prefix checks exist.