Aoshi Geschrieben 25. August 2008 Geschrieben 25. August 2008 Ich bastle mir ein eigenes CMS, leider gibt es Probleme mit dem Login. Aber erst erkläre ich das Prinzip: Sobald man sich einloggt und man "automatisch Einloggen" ausgewählt hat werden Cookies geschrieben. Der Inhalt wird vorher mit Blowfish verschlüsselt, zusammen gesetzt und dann dem Client übergeben. Das Login soll zunächst die Cookies erkennen, diese wieder auseinander nehmen, die entschlüsseln und danach geprüft werden ob der Cookie noch gültig ist. Hier das Script in Kompletter Form: <?php if(isset($_COOKIE['01']) AND isset($_COOKIE['02']) AND isset($_COOKIE['03']) AND isset($_COOKIE['04'])) { $cookievars1 = preg_split("/#/", $_COOKIE['01']); $cookievars2 = preg_split("/#/", $_COOKIE['01']); $cookievars3 = preg_split("/#/", $_COOKIE['01']); $cookievars4 = preg_split("/#/", $_COOKIE['01']); $cookieid = $cookievars1[0]; $cookielevel = $cookievars1[1]; $cookielogin = $crypt->Decrypt($cookievars2[0]); $cookienickname = $crypt->Decrypt($cookievars2[1]); $cookiepassword = $crypt->Decrypt($cookievars3[0]); $cookiemail = $security_crypt->Decrypt($cookievars3[1]); $cookiedate = $cookievars4[0]; $cookieip = $cookievars4[1]; $cookiename1 = $cookievars1[2]; $cookiename2 = $cookievars2[2]; $cookiename3 = $cookievars3[2]; $cookiename4 = $cookievars4[2]; $cookieselect = mysql_fetch_array(mysql_query("SELECT * FROM user WHERE id = '$cookieid'")); if($cookieselect['password_wrong'] <= 3 AND $cookieselect['warn_level'] <= 5) { $cookiereset = mysql_fetch_array(mysql_query("SELECT * FROM user WHERE id = '$cookieid'")); $cookievar0A = $cookiereset["id"]; $cookievar1A = $cookiereset["lvl"]; $cookievar2A = "555"; $cookievarsA = "$cookievar0A#$cookievar1A#$cookievar2A"; $cookievar0B = $security_crypt->Encrypt($cookiereset["login"]); $cookievar1B = $security_crypt->Encrypt($cookiereset["nickname"]); $cookievar2B = "555"; $cookievarsB = "$cookievar0B#$cookievar1B#$cookievar2B"; $cookievar0C = $security_crypt->Encrypt($cookiereset["passwd"]); $cookievar1C = $security_crypt->Encrypt($cookiereset["mail"]); $cookievar2C = "555"; $cookievarsC = "$cookievar0C#$cookievar1C#$cookievar2C"; $cookievar0D = date('d.m.Y G:i:s'); $cookievar1D = $_SERVER['REMOTE_ADDR']; $cookievar2D = "555"; $cookievarsD = "$cookievar0D#$cookievar1D#$cookievar2D"; setcookie("01", $cookievarsA, time()+60*60*24*30, "/", "127.0.0.1"); setcookie("02", $cookievarsB, time()+60*60*24*30, "/", "127.0.0.1"); setcookie("03", $cookievarsC, time()+60*60*24*30, "/", "127.0.0.1"); setcookie("04", $cookievarsD, time()+60*60*24*30, "/", "127.0.0.1"); $user_id = $cookievar0A; $user_level = $cookievar1A; $user_login = $security_crypt->Decrypt($cookievar0B); $user_nickname = $security_crypt->Decrypt($cookievar1B); $user_password = $security_crypt->Decrypt($cookievar0C); $user_mail = $security_crypt->Decrypt($cookievar1C); $user_date = $cookievar0D; $user_ip = $cookievar1D; mysql_query("UPDATE user SET last_date = '$cookievar0D', ip = '$cookievar1D', password_wrong = '0' WHERE id = '$cookievar0A'"); } ?>[/PHP] Sobald ich diesen Teil aus der 2. if-abfrage entferne klappt alles und der entschlüsselt auch alles richtig. [PHP]$cookielogin == $cookieselect['login'] AND $cookiepassword == $cookieselect['passwd'] AND $cookielevel == $cookieselect['lvl'] AND Meine Vermutung liegt darin, dass er vorher die Daten nicht entschlüsselt und daher den Cookie immer abweist. Wäre super wenn mir irgendwer helfen könnte (im Moment teste ich das ganze nur Lokal, daher ist der Cookie auf 127.0.0.1 begrenzt). mfg Aoshi Zitieren
Aiun Geschrieben 26. August 2008 Geschrieben 26. August 2008 Testausgaben, Debugging, wo tritt der Fehler auf, worin besteht der Fehler..... Wenn er es nicht entschlüsselt solltest du dem nachgehen. meine Kristallkugel 2.0 hängt am Ladekabel und ist so schnell nicht wieder nutzbar, sorry. Zitieren
geloescht_JesterDay Geschrieben 26. August 2008 Geschrieben 26. August 2008 Der Inhalt wird vorher mit Blowfish verschlüsselt, zusammen gesetzt und dann dem Client übergeben. Und der Sinn des ganzen? Alles was verschlüsselt ist kann auch wieder entschlüsselt werden. Außerdem stellt es ja einen nicht zu unterschätzenden Aufwand dar (gerade wenn mal mehr als 1 oder 2 Nutzer da unterwegs sind). Und wenn du den Inhalt verschlüsselst heißt das ja, da steht was drin was du entschlüsselt wieder benutzen willst. Aus eigener Erfahrung (ähnliches Problem und die Idee von nem Kollegen damals) tipp ich mal: Du legst den Benutzernamen und das Passwort dort ab. Und dannn kann ich dazu nur sagen: :eek Also ich hab das damals so gelöst: Wenn der Nutzer "eingeloggt bleiben" angeklickt hat, dann wurde ein Cookie gesetzt der nur einen zufälligen Hashwert enthielt. Dieser wurde auch in eine DB geschrieben zusammen mit einem Timestamp. Beim ersten Zugriff auf die Seite wurde geprüft ob eine Session existiert, und wenn nciht ob dieser LoggedIn Cookie gesetzt ist. Dann versucht den Hashwert in der DB zu finden und wenn ja, dann war da auch nonch der Nutzer hinterlegt, also wurde eine Session gestartet, wie wenn der Nutzer sich eingeloggt hätte. Der Timestamp wurde bei jedem "Login" aktuallisiert. Ja, jetz kann man argumentieren, dass man sich dann ja ohne PW anmelden kann o.ä., aber das ist bei dir erstens nicht anders (wenn jemand den Cookie bbzw den Inhalt klaut) und zweitens ist das ja genau das was der Nutzer will. Das so etwas potentiell sehr unsicher ist sollte jeder selber wissen. Aber auf jeden Fall nicht irgendwelche sensiblen Daten als Cookie speichern. auch verschlüsselt ist nur so eine Art Feigenblatt. Wenn man den Inhalt kennt (und der Nutzer wird ja wissen was er eingibt als Benutzernamen z.b.) dann ist ein knacken der Verschlüsselung um einiges leichter und wenn dein Schlüssel der ja auf dem Server hinterlegt sein muss weg kommt sind u.U. recht sensible Daten einfach zu entschlüsseln. Vielleicht hast du das ja nicht so geplant, aber warum verschlüsselst du dann irgendwas? Und, nur mal als Anmerkung weil mir das gerade in den Sinn kommt: Ein Passwoort gehört auch nicht verschlüsselt (auch wenn es Blowfish ist) in die DB gelegt. Jedesmal wenn ich von einer Seite mein PW zugeschickt bekomme könnt ich mich so aufregen Ein PW wird mit einem Salt (Salt (Kryptologie ? Wikipedia) ) versehen, gehasht und so in der DB gespeichert. Das muss niemand kennen ausser der Nutzer. Zitieren
Aoshi Geschrieben 26. August 2008 Autor Geschrieben 26. August 2008 Also zu der Frage mit der Zauberkugel. Die sagt "meine Seite erkennt meinen Cookie immer als ungültig an und somit schmeißt er mich sofort wieder raus". Es war der Folgende Sinn: Da man einfach Cookies klauen kann wollt ich eben 6 Sicherheitsmerkmale in den Cookie einbauen (und in die Abfrage). 1. Damit der Nutzer keine 100 Cookies von mir erhält setze ich verschiedene angaben in einem Cookie. Zudem müssen alle Logincookies unverändert und vollständig vorhanden sein. 2. Gewisser Inhalt soll verschlüsselt werden und gegebfalls wieder entschlüsselt werden. 3. Im cookie gibt es angaben die per Zufall bei jeder Aktuallesierung sich jedesmal ändern. 4. Der Schlüssel für die Blowfishverschlüsselung liegt im abgetrennten bereich der seite und durch .htaccess kann man nur serverseitig drauf zugreifen. Es gibt noch 2 Andere dinge die den Cookie sicherer machen sollen (und alles wird Serverseitig gemacht). Klar gibt es keine 100%ige sicherheit, aber ich finde das man den crackern es schwer machen sollte. Der User wird immer wissen was im Cookie ist, weil er ja diese angaben kennt (jedenfalls seine). Bei mir in der Datenbank werden alle Daten unverschlüsselt liegen, ausser das Password. Das ist in der typischen md5 verschlüsselung. Mein Problem ist das dieser Bereich meiner Seite, also diese Abfrage, den Inhalt des Cookies vor der Abfrage ob dieser noch gültig ist nicht entschlüsselt und somit direkt nach dem einloggen mich wieder rauswirft. 1. Erst wird ermittelt ob ein Cookie für die Seite existiert. 2. Diesen nimmt er dann auseinander 3. (er holt sich den Schlüssel und) Dann Entschlüsselt er die verschlüsselte angaben 4. Danach überprüft er ob diese Angaben noch Korrekt sind 5. Daraufhin wenn alle Angaben stimmen soll er den User Einloggen und wenn diese nicht stimmen soll er eben diese Cookies entfernen. Genau bei 3. liegt das Problem. Er Entschlüsselt nicht vor der Abfrage ob die Angaben stimmen sondern erst nachhinnein. (habs getestet gehabt da ich den folgenden Teil entfernt hatte und er mich einloggte $cookielogin == $cookieselect['login'] AND $cookiepassword == $cookieselect['passwd'] AND $cookielevel == $cookieselect['lvl'] AND JesterDay gab mir noch ne sehr gute idee. mfg Aoshi PS.: Sollte ich wirklich soviele User haben das es unter der Serverlast leiden sollte, so werde ich mir was neues einfallen lassen was das gleiche bietet (also sicherheitsmässig) aber nicht mehr soviel frisst. Da aber zurzeit die Seite noch garnicht Existent ist und nur Lokal läuft, ist zurzeit nichts merkliches festzustellen (kommt auch drauf an wieviele User ich auch drauf bekommen kann wenn die Seite Online geht). Zitieren
geloescht_JesterDay Geschrieben 26. August 2008 Geschrieben 26. August 2008 (bearbeitet) Es war der Folgende Sinn: Da man einfach Cookies klauen kann wollt ich eben 6 Sicherheitsmerkmale in den Cookie einbauen (und in die Abfrage). Hm... ich kapiere das trotzdem nicht. Wenn jemand den Cookie so einfach klauen kann (was IMHO so einfach gar nicht möglich ist), dann ist es doch egal was du alles für tolle Merkmale in deinen Cookie verschlüsselst. Ob die vom User oder vom Cracker kommen merkt dein Server ja nicht, er merkt nur sie sind vollständig. :confused: Wenn der User abgemeldet ist und der Cookie geklaut wird, dann kannst du das nicht feststellen. Ist der User noch online und du willst sowas verhindern, dann ist es viel einfacher den Cookie an eine IP zu binden. Hash in einen 2ten Cookie (die 32 byte die mehr übertragen werden machen den Kohl jetzt auch nicht fett, und der User wird eh tausende Cookies bei sich rumliegen haben. 1 mehr... who cares?) und denselben Hash in die DB zusammen mit der RemoteAddress. Oder ich kapiere dein Vorgehen immer noch nicht... Nachtrag: Eine eindeutige ID wird ja eh als Cookie gesendet: die Session-ID. Also kannst du den Hash oben durch die Session-ID ersetzen und musst nichtmal mehr übertragen als bisher BTW wird das auch von anderen großen Seiten so gemacht. Bearbeitet 26. August 2008 von JesterDay Zitieren
Aoshi Geschrieben 26. August 2008 Autor Geschrieben 26. August 2008 (bearbeitet) Also es hat schon seinen sinn warum es verschlüsselt werden muss, habe einige angaben aus sicherheitsgründen etwas geändert gehabt. Aber das eigendliche Prinzip ist geblieben. Sollte von jemanden wirklich der Cookie gestohlen werden, aber der User inzwischenzeit wieder bei mir auf der seite war, so ist der Cookie schon ungültig (also den geklauten). Daher vermute ich das du bzw. bisher niemand den eigendlichen zweck verstanden hat. Daher beschränke ich mich nur auf die Frage wiese er den Inhalt eines Cookies vor der Abfrage nicht entschlüsselt (siehe ende dieses beitrags). Ich finde den Fehler nicht. - Er schaut er ob der Cookie gesetzt wurde, nehmen wir an er ist es if(isset($_COOKIE['01']) AND isset($_COOKIE['02']) AND isset($_COOKIE['03']) AND isset($_COOKIE['04'])) { - Dann soll er den inhalt jedes angeforderten Cookie auseinander nehmen. $cookievars1 = preg_split("/#/", $_COOKIE['01']); $cookievars2 = preg_split("/#/", $_COOKIE['02']); $cookievars3 = preg_split("/#/", $_COOKIE['03']); $cookievars4 = preg_split("/#/", $_COOKIE['04']);[/PHP] - Dann soll er einige Inhalte entschlüsseln. [PHP] $cookieid = $cookievars1[0]; $cookielogin = $security_crypt->Decrypt($cookievars2[0]); $cookiepassword = $security_crypt->Decrypt($cookievars3[0]); $cookiemail = $security_crypt->Decrypt($cookievars3[1]); $cookiedate = $cookievars4[0]; $cookieip = $cookievars4[1]; - Dann soll er Prüfen ob der Inhalt des Cookies noch gültig ist. if($cookielogin == $cookieselect['login'] AND $cookiepassword == $cookieselect['passwd'] AND $cookiemail == $cookieselect['mail'] AND $cookieip == $cookieselect['ip'] AND $cookieselect['password_wrong'] <= 3 AND $cookieselect['warn_level'] <= 5) { Bei der Überprüfung scheitere ich zurzeit. Aber sobald ich den follgenden Teil rausnehme, funktioniert es (es ist der Teil der vor der Abfrage entschlüsselt werden soll) $cookielogin == $cookieselect['login'] AND $cookiepassword == $cookieselect['passwd'] AND $cookiemail == $cookieselect['mail'] AND Daher weiß ich das er vorher nicht entschlüsselt sondern erst nachher wenn man erfolgreich eingelogt wurde. Jetzt stell ich mir die Frage wieso er es nicht macht und wie ich es ändern kann. Hier das ganze korrekter weise damit ihr einen besseren überblick habt: <?PHP if(isset($_COOKIE['01']) AND isset($_COOKIE['02']) AND isset($_COOKIE['03']) AND isset($_COOKIE['04'])) { $cookievars1 = preg_split("/#/", $_COOKIE['01']); $cookievars2 = preg_split("/#/", $_COOKIE['02']); $cookievars3 = preg_split("/#/", $_COOKIE['03']); $cookievars4 = preg_split("/#/", $_COOKIE['04']); $cookieid = $cookievars1[0]; $cookielogin = $security_crypt->Decrypt($cookievars2[0]); $cookiepassword = $security_crypt->Decrypt($cookievars3[0]); $cookiemail = $security_crypt->Decrypt($cookievars3[1]); $cookiedate = $cookievars4[0]; $cookieip = $cookievars4[1]; if($cookielogin == $cookieselect['login'] AND $cookiepassword == $cookieselect['passwd'] AND $cookiemail == $cookieselect['mail'] AND $cookieip == $cookieselect['ip'] AND $cookieselect['password_wrong'] <= 3 AND $cookieselect['warn_level'] <= 5) { echo "Erfolgreich eingelogt"; } } ?>[/PHP] mfg Aoshi PS.: Mir geht es vorallem um den Lernfaktor. Das es nicht geht seh ich ja zurzeit. Nur möchte ich wissen wieso es nicht funktioniert und wie ich es eventuell ändern könnte damit es geht. Sollte es nicht gehen weil eben ne plausible begründung gibt, dann geht es nicht. Bearbeitet 26. August 2008 von Aoshi Zitieren
geloescht_JesterDay Geschrieben 27. August 2008 Geschrieben 27. August 2008 Also dein Code sieht ok aus. So ein Fehler versteckt sich meist aber nicht im Code, sondern in den Inhalten bzw deren falschen Prüfung o.ä.. Dazu sagt das reine posten des Codes hier nichts. Du wiederholst ja immer wieder wo es schiefgeht. Dann solltest du an der Stelle eben mal nachsehen was da drinsteht und was du erwartest sollte drinstehen. Dabei kann dir hier keiner helfen. Ich schlage vor, du schaust dir einfach mit print_r z.B. mal deine ganzen Variablen an. Dann klappt's auch mit dem Rad neu erfinden Oder noch besser ist es, wenn du einen php-Debugger benutzt. Weiß aber nicht ob du sowas hast. Wir hatten damals einen, das war aber ein kostenpflichtiger Editor. AFAIK war der Debugger ansich aber frei, hab mich aber nicht mehr weiter damit beschäftigt. P.S.: Noch eine persönliche Meinung von mir: Die Grundidee ist ja schon in Ordnung und auch lobenswert, wenn man sich ansieht was andere Leute da so Coden, aber das sind schon die berühmten Kanonen die da auf Spatzen schießen Zum einen ist der Cookieklau auch nicht so häufig und etwas was man einfach so mal macht. Zum anderenkannst du dasselbe mit viel geringerem Aufwand erreichen (Also eine Session an eine IP binden) und das wird schon oft gemacht und hat sich somit bewährt. Gut, deins hat den theoretischen Vorteil, dass es IP unabhängig ist, also auch den Wechsel der IP übersteht. Dabei gilt aber auch wiederum: Sollte der Cookie geklaut werden und dann auch genutzt bevor der Nutzer sich erneut bei deinem Server meldet, dann ist der Cracker für dich der echte Nutzer und der Nutzer bekommt die Meldung seine Daten stimmen nicht (mehr). Und ein IP-Wechsel kommt allenfalls nach 24h vor (oder bei einem Fehler o.ä.) und daher ist das nichts was man so arg beachten muss IMHO. Ich hab mir gerade mal Gedanken zum Cookieklau gemacht. Um einen Cookie deiner Seite zu stehlen müsste der Cracker schon Javascript Code auf deinem Systen einschleußen und dann hast du was falsch gemacht Etwas was sich viel leichter verhindern läßt als dein Konstrukt hier. Oder er hat Zugriff auf den Rechner des Nutzers, und dannn ist der Cookieklau das kleinste Problem. Also das ist meine pers. Meinung, ich finde das übertrieben. Aber dennoch viel Erfolg bei der Sache. Zitieren
Aoshi Geschrieben 27. August 2008 Autor Geschrieben 27. August 2008 Hmmm also wenn es wirklich nicht so einfach sein sollte (naja, gehört hatte ich leider mal was anderes bzw. ich weiß wie man es übern BBcode machen kann) dann werd ichs weglassen. Zumal es eh im mom nicht geht^^; Daher suche ich mal ein paar Themen zum Cookieklau. Zu dem Fehler, ja du hast recht. Da der Code meiner sicht aus sauber zu sein scheint kann tatsächlich der inhalt des Cookies falsch sein, daran dacht ich noch nicht^^;; Dann werd ich mal überprüfen wie es im Cookie steht um so noch zu überprüfen ob darin alles auch so ist wie es sein sollte. Danke für die indirekte Hilfe mfg Aoshi Zitieren
geloescht_JesterDay Geschrieben 27. August 2008 Geschrieben 27. August 2008 Hmmm also wenn es wirklich nicht so einfach sein sollte (naja, gehört hatte ich leider mal was anderes bzw. ich weiß wie man es übern BBcode machen kann) Es gab einige Meldungen über eine XSS Lücke in BBCode bzw in manchen Umsetzungen. Wie gesagt, manche Umsetzungen. BBCode ist deswegen nicht gleich anfällig für XSS. Das muss es aber sein damit du einen Cookie klauen kannst. Wenn du so willst, ist es auch leicht möglich einen Windowsrechner zu übernehmen. Man nehme nur die tausenden Sicherheitslücken die es mal gab Ein Cookie wird vom Browser auf dem Rechner gespeichert. Bei jeder Anfrage an die URL von der der Cookie kommt und die den Pfad beinhaltet für die der Cookie gelten soll wird der Cookie bzw dessen Inhalt mitgesendet. Dann, und nur dann kannst du z.B. über Javascript auf den Cookieinhalt zugreifen (also von der Seite aus für die der Cookie gilt bzw dem Server). Es muss also ein böses Javascript auf deiner Seite laufen, oder etwas auf deinem Webserver. Ansonsten kann es über eine Sicherheitslücke im Browser möglich sein. Das gab es auch schon, aber sowas wird in der Regel schnell gefixt. Du siehst es ist in den häufigsten Fällen ein Fehler deiner Anwendung, wenn ein Cookieklau möglich ist. Daher solltest du die Energie lieber darein stecken sowas zu verhindern, weil damit dann auch mehr als nur ein Cookieklau möglich ist. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.