C#: OData, SAP NW Gateway und CSRF-Token

Bei allen Änderungsanfragen (PUT, POST und DELETE) eines Clients gegen einen SAP Netweaver OData-Service muss der Client ein entsprechendes CSRF (Cross Site Request Forgery) Token mitgeben. In diesem Beitrag wird jetzt gezeigt wie man an solches Token anfordern und dann bei den OData-Requests mitgeben kann.

CSRF – Cross Site Request Forgery

Zunächst einmal ein paar Grundlagen zum Thema CSRF-Attacke. CSRF-Attacken (in deutsch etwa Website-übergreifende Anfragenfälschung) werden auch als „Session Riding“ oder „One Click Attacks“ bezeichnet. Doch was genau passiert bei einem solchen Angriff: Der Angreifer führt dabei in einer Webanwendung eine beliebige Transaktion (z.B. Benutzerkonto löschen, Passwort ändern, usw.) aus, tut dies aber nicht direkt sondern führt diese Aktion im Kontext des Opfers aus. Dafür muss das Opfer aber bereits in der entsprechenden Webanwendung angemeldet sein, dann wird dem Opfer (ohne dessen Wissen) ein arglistiger HTTP-Request untergeschoben um die gewünschte Aktion auszuführen.

Als Schutz gegen einen CSRF-Angriff kann ein geheimes Token eingeführt werden, das nur schwer vom Angreifer erraten werden kann. Bei jedem Seitenaufruf der Webanwendung wird dieses Token als Parameter in URLs oder als Header-Feld mit übertragen. Die Webanwendung prüft bei jedem Client-Request, ob das übertragene Token mit dem zur Sitzung hinterlegten Wert übereinstimmt. Im Fehlerfall wird der angeforderte Aufruf abgelehnt. Ohne Kenntnis dieses Tokens kann ein Angreifer keinen gültigen HTTP-Request nachstellen.

Ablauf

  • CSRF-Tokens anfordern
  • Das SAP Gateway generiert das CSRF-Token und sendet dieses in der HTTP-Antwort als Headerfeld namens „X-CSRF-Token“ zurück an den anfragenden Client. Die Anfrage für die Generierung des Tokens muss in einem nicht modifizierenden Request (im Normalfall GET) erfolgen. Dabei sendet der anfragende Client im HTTP-Header das Feld „X-CSRF-Token“ mit dem Wert „Fetch“ an das Backend. Danach generiert die ICF Laufzeit ein neues Token und sendet dieses Token dann im Header zurück an den Client.

  • Übernahme des CSRF-Tokens in den Änderungsrequest
  • Nun kann das zurückgelieferte Token in den Änderungsrequest übernommen werden. Dabei wird im jeweiligen Request einfach das Headerfeld „X-CSRF-Token“ mit dem zurückgelieferten Wert belegt. Die ICF Laufzeit validiert dann für alle modifizierenden Requests die Gültigkeit des Tokens. Scheitert die Validierung wird der HTTP Statuscode 403 (Forbidden) zurückgeliefert.

Request zum Anfordern des CSRF-Tokens

Das folgende Beispiel zeigt eine Methode zur Abfrage des CSRF-Tokens:

In Zeile 21 wird dem Request ein Headerfeld „X-CSRF-Token“ mit dem Wert „fetch“ hinzugefügt. Dadurch wird das Backend (ICF-Laufzeitumgebung) angewiesen ein neues Token zu generieren. Das generierte Token wird dann im Header zurück zum anfragenden Client geschickt. Dieses Token wird im oben gezeigten Beispiel dann ab Zeile 25 ausgewertet bzw. gespeichert. Dies allein genügt aber noch nicht um einen gültigen HTTP-Request zu erzeugen. Neben dem CSFR-Token muss das vom Backend gesendete Cookie in den Request übernommen werden. Die Cookie-Informationen werden in Zeile 25 aus der HTTP-Response extrahiert und gespeichert. Wird das Cookie nicht in den neuen Request übernommen kommt es zu einer Fehlermeldung „Validierung des X-CSRF-Tokens fehlgeschlagen.“

Diese Methode wird nun vor jedem ändernden (POST, PUT, DELETE) Request aufgerufen. Das dann ermittelte Token inkl. des zurückgelieferten Cookies müssen dann in die eigentliche Änderungsabfrage übernommen werden. Wird der Microsoft OData-Client verwendet kann man dafür das Event OnSendingRequest2 verwenden. Das sieht dann wie folgt aus:

Ein andere Möglichkeit wäre die CSRF-Token Anforderung zu automatisieren. Dafür könnte man auf die die HttpMethod-Eigenschaft der HttpWebRequest-Klasse zurückgreifen. Für den Microsoft OData-Client könnte dies ebenfalls in dem Ereignis OnSendingRequest2 erfolgen:

Innerhalb des Webdebuggers Fiddler sehen die Anfrage und die Antwort dann wie folgt aus:

Anfrage

Antwort

Literaturverzeichnis und Weblinks

Abk.Quelle
[1]Cross-Site Request Forgery Protection
https://help.sap.com/saphelp_nw75/helpdata/de/b3/5c22518bc
72214e10000000a44176d/content.htm
[2]CSRF Protection
https://help.sap.com/saphelp_nw75/helpdata/de/55/74ed6c9365
4ee4999b4d07cdda532c/content.htm
[3]Telerik Fiddler
http://www.telerik.com/fiddler

Kommentar verfassen

Fork me on GitHub