Wie rufe ich eine benutzerdefinierte URL oder einen Webhook ohne SSRF auf?
das heygrc team
Validieren Sie das Ziel, bevor Sie es aufrufen: Erfordern Sie https, lösen Sie den Host auf und lehnen Sie private, interne sowie link-lokale Adressen ab (einschließlich Cloud-Metadaten-Endpunkte). Bevorzugen Sie eine Allowlist, wenn die Ziele bekannt sind, und folgen Sie Weiterleitungen nicht blind. Server-Side Request Forgery ist ein Eingabevalidierungsproblem (NIST 800-53 SI-10), und die Prüfung erfolgt im Code, der die Anfrage stellt.
Ziel validieren
Erlauben Sie nur die beabsichtigten Schemata (normalerweise https) und lehnen Sie Adressen in privaten, Loopback-, Link-Local- und Metadaten-Bereichen ab. Validieren Sie die aufgelöste Adresse zum Zeitpunkt der Verbindung, nicht nur die URL im Voraus, da DNS zwischen einer Vorabprüfung und der tatsächlichen Anfrage unterschiedlich auflösen kann (DNS Rebinding).
Bevorzugen Sie eine Allowlist
Wenn die Menge der Ziele bekannt ist (eine feste Liste von Partner-Endpunkten), verwenden Sie eine Allowlist, anstatt beliebige URLs zu akzeptieren. Je enger die Eingabe, die Sie akzeptieren, desto weniger kann schiefgehen.
Folgen Sie Weiterleitungen nicht blind
Eine Weiterleitung kann eine validierte öffentliche URL zu einer internen Adresse beim nächsten Hop umleiten. Validieren Sie bei jeder Weiterleitung erneut oder deaktivieren Sie das Folgen von Weiterleitungen für benutzerdefinierte Ziele.
async function send(url, payload) {- return fetch(url, { method: 'POST', body: payload })+ // safeFetch validiert die AUFGELÖSTE Adresse zum Zeitpunkt der Verbindung+ return safeFetch(url, { method: 'POST', body: payload, allowRedirects: false })}Die Validierung der aufgelösten Adresse zum Zeitpunkt der Verbindung (nicht nur der URL im Voraus, was durch DNS Rebinding umgangen werden kann) verhindert, dass ein manipuliertes Ziel interne Dienste erreicht.