Neuigkeiten:

moziloCMS verwendet Cookies. Wenn Sie auf unserer Seite weitersurfen, stimmen Sie der Cookie-Nutzung zu Datenschutzerklärung
moziloCMS Layouts
moziloCMS Plugins

Hauptmenü

Mozilo Sicherheitsproblem

Begonnen von MarcAurel, 17. März 2016, 20:43:20

« vorheriges - nächstes »

hausl78

#30
Der Vorschlag von @MarcAurel das Hashen schon auf den Client vorzulagern würde imho mozilo jedenfalls sicherer machen.  Und jeder der kein JS hat/will etc.. hat halt den Klartext-Standard, dh das Hashing passiert erst bei PHP am Server vor dem Vergleich mit den in den Configs gespeicherten (gehashten) Benutzer-PW.

Ich denke dazu sollte damit nichts mehr unklar sein, oder?

laborix

Wo liegt der Unterschied zwischen einem Klartext Passwort und einem Klartext (sicheren) Hash auf den Server zu übertragen, wenn man in der Benutzerverwaltung das so oder so gehashte Passwort vergleicht?

Jemanden mit keine Ahnung (siehe einige Postings hier) zu deklarieren ohne diese Personen zu kennen ist meines Erachtens nicht in Ordnung. Das musste jetzt noch sein, sorry...

djr

@MarcAurel:
Zitat von: MarcAurel am 25. März 2016, 11:27:20
Ich bin aber hergekommen nicht nur um zu nehmen sondern auch zu geben, ...
Die Einstellung gefällt mir!
Das hast Du ja auch mit "Mozilo mehrsprachig" gezeigt.

@MarcAurel (& @hausl78):
Gegen den "Man-in-the-Middle" hilft der hier diskutierte Vorschlag nicht. Das haben @laborix & @wasp schon geschildert.

Noch viel Problematischer ist, dass die von (Dir) @MarcAurel vorgeschlagene Codeänderung Sicherheitslücken hat.
Diese öffnen u. a. die Tür für weitere Angriffstypen als den des "Man-in-the-Middle".

Der Reihe nach:

Die function check_login() akzeptiert zwei verschiedene Variablen als möglichen Passwort-Behälter.
Die function check_login() akzeptiert zwei verschiedene Strings als mögliches Passwort.
Zitat von: MarcAurel am 22. März 2016, 20:27:59
  function check_login() {
        # ...
        $user = getRequestValue("ac_user","post",false);
        $pw = getRequestValue("ac_password","post",false);
        $pwh = getRequestValue("ac_password_hash","post",false);
        # ...
            if ($pwh != ""){
               if($this->checkLoginDataJavascript($user, $pwh)) {
                  # ...
                  $_SESSION['AC_LOGIN_STATUS'] = 'login_ok';
               }
            }
            else{
               if($this->checkLoginData($user, $pw)) {
                  # ...
                  $_SESSION['AC_LOGIN_STATUS'] = 'login_ok';
               }
            }
  # ...


Für weiteres muss erst folgende Frage geklärt werden:
Zitat von: MarcAurel am 22. März 2016, 19:08:26
Wozu bemüht man sich das Passwort in der Datenbank zu  verschlüsseln wenn sowieso bei jedem Einloggen im Klartext zum Server gesendet wird?

In erster Linie geht es bei einem als Hash gespeicherten Passwort darum, dass es sich als Wert von dem Passwort-Wert unterscheidet der (vom Browser) an den Server geschickt wird.
Das ist z. B. für den Fall wichtig, in dem das Passwort aus der Datenbank geklaut wurde. Der Dieb kann diesen Wert nicht als Passwort zum Einloggen in den Account nutzen. (Außer er kann daraus das PW rekonstruieren. Stichwort: Rainbow-Table.)

Durch die function checkLoginDataJavascript($user, $hash) wird die gerade beschriebene Sicherheitsvorkehrung ausgehebelt:
Zitat von: MarcAurel am 22. März 2016, 20:27:59    protected function checkLoginDataJavascript($user, $hash) {     
        if(isset($this->ac_users[$user]) and ($hash == $this->ac_users[$user][0])) {
            return true;
        }
        return false;
    }


Fazit
Der diskutierte Code von (Dir) @MarcAurel erhöht die Sicherheit von mozilo nicht.
Schlimmer noch, er bietet mehr Angriffsfläche.

@MarcAurel: wie zu Beginn schon gesagt, gefällt mir Deine Einstellung des "nicht nur Nehmen, sondern auch Geben".
Das macht Projekte wie mozilo erst möglich.
Also lass Dich bitte hiervon nicht entmutigen.

MarcAurel

#33
Zitat von: djr am 01. April 2016, 18:00:34

Durch die function checkLoginDataJavascript($user, $hash) wird die gerade beschriebene Sicherheitsvorkehrung ausgehebelt:


Wie? Oder es ist nur eine Bahauptung oder ein Eindruck?   :?:

Tatsache ist, wenn ein Angreiffer  so wie es jetzt ist, kann das Passwort im Klartext mitlesen, es ist nicht verkehrt dieses zu hashen und somit es sicherer zu machen.
:)


p.s. Un nicht nur ein Angreiffer, jeder Systemadministrator eines ofentliches WLAN, Firmenadministrattor, überal wo Proxies eingesetzt werden, kann bei deinem Login dein Username und Passwort mitlesen und aus Neugierde so schauen was du auf deiner Website so betreibst. Ist das Passwort gehasht, hat er ein Problem mit seiner Neugierde.

Wenn noch dazu dein eigenes Proxy einsetzt, die Möglichkeiten sind unbegrenzt, deswegen habe ich auch NOSSL erwähnt.
Ich werde bei Gelegenheit auch ein eigenes Proxy für Mozilo presäntieren.
:)

MarcAurel


Für StefanB falls er sich entschließen sollte diese Arte von Verschlüsselung des Passwortes, eigentlich eine  von den wenigen einfachen Möglichkeiten, in Mozilo  einzufügen, hier der End-Vorschlag von mir mit dem UserName als Salt (es kann ruhig öffentlich sein, anderes geht es ja nicht) und ein zusätzlicher Hash von dem eigentlichen 64 Byte Hash , das eigentlich  sicher für den normalen Anwender sein sollte:

var hash = SHA256( SHA256( UserName + Passwort) );

Mit der Möglichkeit natürlich, zumindest für AccessControl sich auch ohne JavaScript anzumelden, aber dann nicht gehasht. Aber das habe ich schon erledigt und Interessierten werde ich das Plugin zur Verfügung stellen. Es funktioniert jetzt unabhängig von Mozilo und seinen Crypto-Funktionen.

Wer anderer Meinung ist, soll es bitte aber mit Bespiele (Code eventuell) veranschaulichen, ich lerne gerne etwas neues dazu. Ich bin bereit dann den Code zu testen und die  Ergebnisse objektiv zu beurteilen.


hausl78

Zitat von: laborix am 01. April 2016, 14:40:36
Wo liegt der Unterschied zwischen einem Klartext Passwort und einem Klartext (sicheren) Hash auf den Server zu übertragen, wenn man in der Benutzerverwaltung das so oder so gehashte Passwort vergleicht?

Das es niemand im Daten-Traffic im Klartext mitlesen kann, sondern nur den PW-Hash sieht, mit dem man sich aber nicht einloggen kann. Daher denk ich schon das es gegen Traffic-Sniffer Sinn ("Man in ...") hat.

Das Problem sehe ich eher das mozilo den richtigen Vergleich anstellt beim Loginversuch. Darauf bezogen:

Zitat        $user = getRequestValue("ac_user","post",false);
        $pw = getRequestValue("ac_password","post",false);
        $pwh = getRequestValue("ac_password_hash","post",false);

Dh wenn da (zusätzlich) vom Browser manipulierte POST-Parameter kommen, (an denen das CMS festmacht wie es mit den Werten umgeht) kann man dem CMS ja unterjubeln das es ein Hash ist der dann (ohne vorherigem Hashing durch das CMS) direkt mit dem Hash gem. Benuzerdaten verglichen wird und man somit über den mitgelesenen Hash sich direkt einloggen kann.


MarcAurel

Zitat von: hausl78 am 01. April 2016, 22:26:31
kann man dem CMS ja unterjubeln das es ein Hash ist der dann (ohne vorherigem Hashing durch das CMS) direkt mit dem Hash gem. Benuzerdaten verglichen wird und man somit über den mitgelesenen Hash sich direkt einloggen kann.

Aber wie ? Ich möchte es auch können wenn es mögöich ist.  :)

Anderseits, wenn so bleibt wie es ist, es ist überhaupt kein Aufwand notwendig, man hat ja das Passwort im Klartext oder? ;D

hausl78

#37
zum 2. Satz: Ja.

zum 1. Satz: Ich finde diesen Code
Zitat  $user = getRequestValue("ac_user","post",false);
        $pw = getRequestValue("ac_password","post",false);
        $pwh = getRequestValue("ac_password_hash","post",false);
gerade nicht...

Aber was passiert, wenn ich den Hash (den du per JS schon am Client erzeugt hast) und den Benutzername aus dem Traffic "erschnüffle" und dann mache ich per cURL, AJAX, CSRF was auch immer einen POST-Request mit
?ac_user=MarcAurel&ac_password_hash=[der erschnüffelte Hash]

Dann wird das doch auch vom CMS so verarbeitet und ich bin direkt angemeldet... ODER?

(Wie gesagt ich finde den Code dazu gerade nicht checkLogin() ... Methode ->checkLoginDataJavascript() etc.. )

djr

Zitat von: MarcAurel am 31. März 2016, 18:01:21
Ich möchte den sehen der sich "mit dem Hash" einlogen kann. ;D

djr

#39
Zitat von: hausl78 am 01. April 2016, 23:39:48
Aber was passiert, wenn ich den Hash (den du per JS schon am Client erzeugt hast) und den Benutzername aus dem Traffic "erschnüffle" und dann mache ich per cURL, AJAX, CSRF was auch immer einen POST-Request mit
?ac_user=MarcAurel&ac_password_hash=[der erschnüffelte Hash]

Dann wird das doch auch vom CMS so verarbeitet und ich bin direkt angemeldet... ODER?

Ja, dem ist so! (ac_password darf dazu aber nicht leer sein.) Siehe Screenshots in meinem Post zuvor.

Zitat von: hausl78 am 01. April 2016, 23:39:48
(Wie gesagt ich finde den Code dazu gerade nicht checkLogin() ... Methode ->checkLoginDataJavascript() etc.. )
:arrow: http://www.mozilo.de/forum/index.php/topic,4174.msg21360.html#msg21360

MarcAurel

Hallo djr,
vielen  Dank für die kleine Demonstration. Ich lerne gerne dazu, besonders in dem Bereich.
Aber wir belassen es nicht dabei. Ich habe es trotzdem ungerne wenn andere mein Passwort beschnüffeln können und damit machen was sie wollen.

Deswegen, habe ich das Ganze ein wenig  ,,umgestaltet" und ich habe auf die Schnelle  auch eine kleine Verschlüsselung eingefügt.
Wenn nichts dagegen hast, könntest du es mal damit probieren, was du durch einen Sniffer sehen kannst, hier:

ac_password_id=76366207-aa78-4963-9dd2-9193ce76395f&ac_password_hash=yY3KBNd8AwBrm4ywK6MBhHGkX2umpTTfos4t%2Bn6ueEA8VMDIsIXw4vkFC1rZDPn2xFEfpYn9cE6F4jcApAvmmQ%3D%3D&ac_user=Testmann&ac_password=yY3KBNd8AwBrm4ywK6MBhHGkX2umpTTfos4t%2Bn6ueEA8VMDIsIXw4vkFC1rZDPn2xFEfpYn9cE6F4jcApAvmmQ%3D%3D&ac_action=login – 999

Um das Ganze spannender zu machen habe das Passwort natürlich geändert.
JavaScript hier:

.'var password = document.getElementById("ac_password");'
      .'var passwordHash = document.getElementById("ac_password_hash");'
      .'var passwordId = document.getElementById("ac_password_id");'
      .'function ComputeHash() {'   
      .'var id  = passwordId.value;'   
      .'var hash  = SHA256(password.value);'
      .'var key_hash = CryptoJS.MD5(id);'
      .'var key = CryptoJS.enc.Utf8.parse(key_hash);'
      .'var iv  = CryptoJS.enc.Utf8.parse("1234567812345678");'
      .'var encrypted = CryptoJS.AES.encrypt(hash, key, { iv: iv,mode:CryptoJS.mode.CBC,padding:CryptoJS.pad.ZeroPadding});'
      .'passwordHash.value = encrypted;'
      .'password.value = encrypted;'             
      .'}'
Gruß



MarcAurel

Ich war selbst mit der vorherigen Lösung nicht zufrieden und deshalb weiter experimentiert, aber die Lösung hat sich schon vorgezeichnet.
Und jetzt haben wir die Lösung,  Sicherheit auch ohne SSL.
Ich danke den Skeptikern die immer nur auf SSL bestanden haben, habe durch mein Rumexperimentieren einiges dazu gelernt.
Die Lösung bedarf zumindest für das AccesControl keine Änderungen in Mozilo, es wird nur ein Stück Software namens NOSSL dazu eingefügt, das die ganze Arbeit macht.

Es kann hier ausprobiert werden:
http://publius.lima-city.de/Login.html

User: Testmann
Passwort: Testmann2016

Was ein eventueller Sniffer sieht ist das:

nossl_encrypted_form_values=%40NoSSL_Package_begin%40---%40NoSSL_Version_begin%401.2%40NoSSL_Version_end%40%40NoSSL_MsgType_begin%40RSA%40NoSSL_MsgType_end%40%40NoSSL_RSAKey_begin%40%0D%0Aa97d1dcf67f54f86b73b8cd5732fa230112531dd0fb0866be9f71c7dc5f644fc6%0D%0Acb3e8ddd94eea63608cad390fab93ff64c9fd3131a144bd021b53b1cda3c8b542%0D%0Ac26ef0fa14784eb122b1a43bd909b376454b5b4d0d955b5600b0e380f4a65c24e%0D%0A214ceef44b1deca73914d400e94ad8122805c67598a56123a98db095b7f35bb0d%0D%0A31e3f616a269e300722d89d931014c422e43e5de42d2d921fbadee1630c0792b0%0D%0A94d8d0e62b33cfd0d452f276b871dc2fe610e591097db - 1492
e5d0aa6e6214fefcd3b8%0D%0A8cddca34ec7b56467929f1181e79208886f61b2ba531a0ad4a13a3dff3fea47f9%0D%0A6ef07890afc7c9335437641c91382771300efd14799f55ffff87a9b7f%0D%0A%40NoSSL_RSAKey_end%40%40NoSSL_PTR_begin%40bbd7826c2d%40NoSSL_PTR_end%40%40NoSSL_ETR_begin%4060f2da6d2bba6e18c5c79920e66d3ef09cbc090b96bfcf5bd164a202fb4d0993a6a922d4215cad7f0771d7838c65b5a89e0c4ec3ad6576647c00f43f6ac1a11791482c6f277f9174d9e14559b5c63e45cb719821a5d1424ba071d408bde539afdf0afe2ba3564727f84a42cf7a348572e993c5b6606bf522a83acc1695b6e4c81767f07ed54fe860ce622a4df04b94606532729067dcf509b63b3439a98213d0925aa7e6b609409c2844a0eb8129ab99d68b31407ba5604b6376565c46dfe051fd2c9cd49a39b0af95f7d2ba7fb585eaf1378b082ad25de11180e0fe8fe4bc0f8c026c864bfd64376cf2c467e9316b6fd5401bb64c56840add9b21388a8c7669%40NoSSL_ETR_end%40%40NoSSL_ETA_begin%40xgJ70szYAFdUjY5LvvPaDfdM%40NoSSL_ETA_end%40%40NoSSL_MessageKey_begin%407fb0cdf902deee4be38439292f29de58a5efcbd06f1a1c69be628eb085f76d4055fe3bf2e98e90e88aa369a7dd3ddac53e068151d4d224d7b2289be25ae89b1ddaee7ffdfcf96361ebbfa1fabf6148e8868a21e5951b7d9c3eac8757e08d4059b6d21cf16a2392e77d8b4979f6052f4289534e739b6d204c8c622d668abf699a39edf0175f04078e02b6d9e4a4dcd620964fac5909d282f94a673c6b25bbf0ad8f21b903acdd8e086e416eaa02b42c46c82b421f5fc96330bc0dcad33eb47dac7a2bc294c8563669a4c00b3407fd08779523d267fee30036215b6b7f77899eef88f0e53afb250498153f3ec4cc5e99dd0eb298e1c17c3ff85c6830026aac177e%40NoSSL_MessageKey_end%40%40NoSSL_ClientID_begin%40yAKMk8zYAFcf - 1492
0RTJ5e%2B7fu%2FI9ecerXMNltCY4Tsi%40NoSSL_ClientID_end%40%40NoSSL_MessageID_begin%40yQL2S8zYAFdYmRfX5cQZXvDugrhUuznmRjlTP5k%3D%40NoSSL_MessageID_end%40%40NoSSL_Message_begin%40zAJd2MzYAFf58LmBGO2GprX%2F%2B8Fll%2BAmSWMuVXHegjN0sE76w9IDtlIGBehseC8hh2yIt9z6mrIaApEhUvs%2FSsTHKqsYIQcRX5bkBocr6fwDG1WkxlAtuOFPUw8HXg%2FdoWzjLyzmsWcogPHpEqaO1BKelk68BTLSfQnkydEzjNf3DYhN5pLeE54LPmmARVG1v22oL6SjqLE%3D%40NoSSL_Message_end%40---%40NoSSL_Package_end%40 - 480


djr


MarcAurel

Zitat von: djr am 03. April 2016, 16:18:56

Ohne Worte.
(siehe Screenshots)

Wo liegt jetzt das Problem?

Ich habe doch von Anfang an gesagt, das System sollte auch ohne JavaScript funktionieren, aber dann eben nicht verschlüsselt. Wenn du ein zweites Mal nur auf die Login-Seite klickst, bekommst du den Login auch ohne NOSSL. Diese Verschlüsselung ist relativ Speicherintensiv,  und sollte gezielt nur bei Bedarf eingeschaltet werden.

Mir wäre für Mozilo lieber eine eigene Verschlüsselung-Lösung, da für die kommerzielle Nutzung von NOSSL Gebühren fällig sind.


djr

Sorry, ich dachte das erklärt sich in meinem ersten Post.

Lass es mich so sagen:
Ein Türschloss das mehr als einen Schlüsselbart akzeptiert ist nicht sicher.