Wat is Server-side request forgery (SSRF)?

Server side request forgery is een aanval waarbij de server een request doet die het niet zou moeten doen.

Voorbeeld van SSRF

In het onderstaande voorbeeld kan de aanvaller alleen bij de website www.cyberant.com komen. De aanvaller wil de website admin.cyberant.com aanvallen, welke niet bereikbaar is via het internet. Daarom is de enige optie om dit te doen via de website.

Uiteraard kan de aanvaller proberen om de website volledig over te nemen, maar als dit niet lukt (en die kans is groot natuurlijk), dan is er nog een optie: SSRF.

Stel het volgende request wordt gebruikt:

POST /vulns/1/info HTTP/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 123

vulnApi=https://vulns.cyberant.com/

De server gaat nu informatie ophalen bij vulns.cyberant.com. De API is echter vrij in te vullen, dus de aanvaller kan dit vrij aanpassen:

POST /vulns/1/info HTTP/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 123

vulnApi=https://admin.cyberant.com/launch/missles

De website zal nu een request doen naar admin.cyberant.com in plaats van vulns.cyberant.com. Afhankelijk van de implementatie van de website kan het zijn dat het resultaat van de admin applicatie wordt weergegeven of niet. Als het request wel gedaan wordt, maar het resultaat wordt niet weergegeven is er sprake van een blind SSRF-kwetsbaarheid.

Hoe kun je SSRF voorkomen?

SSRF-kwetsbaarheden zijn te voorkomen door de client het request zelf te laten doen. Dit moet uiteraard wel mogelijk zijn, in het bovenstaande voorbeeld kan de gebruiker niet bij de vulns-applicatie. Een andere optie is door een whitelist toe te passen of de URL voor te configureren zodat de aanvaller deze niet aan kan passen.