{"id":417,"date":"2010-11-28T20:28:12","date_gmt":"2010-11-28T19:28:12","guid":{"rendered":"https:\/\/d-mueller.de\/blog\/?p=417"},"modified":"2011-01-04T23:15:24","modified_gmt":"2011-01-04T22:15:24","slug":"angriffe-auf-webanwendungen-teil-4-csrf","status":"publish","type":"post","link":"https:\/\/d-mueller.de\/blog\/angriffe-auf-webanwendungen-teil-4-csrf\/","title":{"rendered":"Angriffe auf Webanwendungen \u2013 Teil 4: CSRF"},"content":{"rendered":"<h3>Vorherige Teile der Serie<\/h3>\n<ul>\n<li><a href=\"https:\/\/d-mueller.de\/blog\/angriffe-auf-webanwendungen-teil-1-xss-beispielangriff\/\">Teil 1: XSS<\/a><\/li>\n<li><a href=\"https:\/\/d-mueller.de\/blog\/angriffe-auf-webanwendungen-teil-2-session-highjacking-und-session-fixation\/\">Teil 2: Session-Highjacking und Session-Fixation<\/a><\/li>\n<li><a href=\"https:\/\/d-mueller.de\/blog\/angriffe-auf-webanwendungen-teil-3-sql-injection\/\">Teil 3: SQL-Injection<\/a><\/li>\n<\/ul>\n<p>CSRF steht f\u00fcr Cross-Site Request Forgery und l\u00e4uft komplett beim Opfer ab. Das einzige, was der Angreifer tut, ist dem Opfer einen speziellen Link zuzuschicken. GMail war mal anf\u00e4llig f\u00fcr CSRF-Attacken. Dass klar wird, was sich genau dahinter verbirgt, gibts erstmal ein Beispiel.<\/p>\n<h3>Beispielangriff<\/h3>\n<p>Das Opfer ist bei facebook eingeloggt &#8211; was man ja sowieso als facebook-User quasi immer ist, auch wenn man nicht auf der Seite selbst unterwegs ist. Jetzt schickt der Angreifer dem Opfer einen durch einen URL-Shortener verschl\u00fcsselten Link zu, der aber in echt <\/p>\n<pre data-enlighter-language=\"enlighter\" class=\"EnlighterJSRAW\">http:\/\/www.facebook.com?deleteAccount=1<\/pre>\n<p> lautet und &#8211; zack, der Account ist futsch. Ist nat\u00fcrlich quatsch, die Jungs von facebook haben sich da schon Gedanken zu gemacht. Aber das Prinzip ist wohl klargeworden. Man kann sogar als Angreifer noch einen Schritt weitergehen und auf einer Webseite ein Bild einbinden, welches einen speziellen Link referenziert. Beispiel: <\/p>\n<pre data-enlighter-language=\"html\" class=\"EnlighterJSRAW\">&lt;img src=&quot;http:\/\/www.gmail.com?to=chef@firma.de&amp;subject=K\u00fcndigung&amp;text=Ich%20k\u00fcndige!!!&quot; \/&gt;<\/pre>\n<p> &#8222;Kritische&#8220; Anfragen nur per $_POST zuzulassen ist auch keine L\u00f6sung, denn ein Angreifer k\u00f6nnte in einem iframe einfach einen POST-Request in einer Form ausf\u00fchren, der dann etwa wie folgt aussieht<\/p>\n<pre data-enlighter-language=\"html\" class=\"EnlighterJSRAW\">\r\n&lt;form action=&quot;http:\/\/www.facebook.com\/profile.php&quot; method=&quot;post&quot;&gt;\r\n\t&lt;input name=&quot;deleteAccount&quot; value=&quot;1&quot; \/&gt;\r\n\t&lt;input type=&quot;submit&quot; \/&gt;\r\n&lt;\/form&gt;\r\n&lt;script&gt;\r\n\tdocument.forms[0].submit();\r\n&lt;\/script&gt;\r\n<\/pre>\n<p>Auch ein Referrer-Check ist nicht zu empfehlen, weil damit evtl. Leute hinter Proxies ausgeschlossen werden. Au\u00dferdem k\u00f6nnte man per CURL den Referrer ja auch bequem faken.\n<\/p>\n<h3>Abwehrtechniken<\/h3>\n<p>So wirklich hilfreich ist eigentlich nur ein sogenanntes Shared-Secret bei gleichzeitiger, absoluter <a href=\"https:\/\/d-mueller.de\/blog\/angriffe-auf-webanwendungen-teil-1-xss-beispielangriff\/\">&#8222;XSS-Freiheit&#8220;<\/a> einer Webseite. Dazu gleich mehr. Wir erzeugen einen beliebigen, zuf\u00e4lligen String (=shared secret) und stecken ihn in die Session:<\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">\r\n&lt;?php\r\n$sharedsecret = md5(uniqid());\r\n$_SESSION[&#039;sharedsecret&#039;] = $sharedsecret;\r\n?&gt;\r\n<\/pre>\n<p>Weiterhin wird dieses Shared Secret in ein Hidden-Feld in der eigentlichen Form gesetzt:<\/p>\n<pre data-enlighter-language=\"html\" class=\"EnlighterJSRAW\">\r\n&lt;form action=&quot;validate.php&quot; method=&quot;POST&quot;&gt;\r\n\t... some fields...\r\n\t&lt;input type=&quot;hidden&quot; name=&quot;sharedsecret&quot; value=&quot;&lt;?php echo $sharedsecret; ?&gt;&quot; \/&gt;\r\n\t... some fields...\r\n&lt;\/form&gt;\r\n<\/pre>\n<p>In der aufgerufenen <b>validate.php<\/b> wird nun gecheckt, ob das per $_POST \u00fcbertragene Shared Secret gleich dem der Session ist. Ist dem nicht so, wurde eine CSRF-Attacke erkannt. Wie oben bereits erw\u00e4hnt ist die Voraussetzung zum funktionieren dieser Technik eine absolute XSS-Freiheit der Webseite, denn wenn der Angreifer per eingeschleustem Javascript Zugriff auf die Seite hat, kann er auch das Hidden-Feld auslesen und gelangt auf diese Art und Weise dann doch wieder an das Shared Secret.<\/p>\n<p><b>Update:<\/b> Ich habe einen neuen Artikel ver\u00f6ffentlicht, der sich mit <a href=\"https:\/\/d-mueller.de\/blog\/kreative-attacken-mit-csrf\/\">kreativen &#8222;Einsatzm\u00f6glichkeiten&#8220;<\/a> von CSRF befasst.<br \/>\n<br \/><b>Update 2:<\/b> Ich habe (mit Dank an Oliver aus den Kommentaren) ein sinnvolleres (weil funktionierendes) Beispiel gew\u00e4hlt.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Vorherige Teile der Serie Teil 1: XSS Teil 2: Session-Highjacking und Session-Fixation Teil 3: SQL-Injection CSRF steht f\u00fcr Cross-Site Request Forgery und l\u00e4uft komplett beim Opfer ab. Das einzige, was der Angreifer tut, ist dem Opfer einen speziellen Link zuzuschicken. &hellip; <a href=\"https:\/\/d-mueller.de\/blog\/angriffe-auf-webanwendungen-teil-4-csrf\/\">Weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,6,3],"tags":[],"class_list":["post-417","post","type-post","status-publish","format-standard","hentry","category-php","category-security","category-webdev"],"_links":{"self":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/posts\/417","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/comments?post=417"}],"version-history":[{"count":0,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/posts\/417\/revisions"}],"wp:attachment":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/media?parent=417"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/categories?post=417"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/tags?post=417"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}