Cross-Site Request Forgery

PHP Newsletter Software/Script und E-Mail-Marketing Software SuperWebMailer

Moderator: mirko

Antworten
MichaelF
Beiträge: 11
Registriert: 28.03.2008, 08:30

Re: Cross-Site Request Forgery

Beitrag von MichaelF »

Ok, ich habe die Ursache gefunden.

Die "index.php" wurde schon mehrfach aufgerufen auf jeder Seite und zwar dann, wenn man KEIN Logo definiert hat oder dieses leer gespeichert hat.

Dann wir so ein Stück HTML gerendert:

Code: Alles auswählen

<img src="https://superwebmailer.domain/" class="normalimage" alt="">
Was dann dazu führt, dass die index.php aufgerufen wird und damit das Cookie sofort wieder löscht.
Evtl. hier als Bugfix eine Überprüfung einbauen ob "Firmenlogo ändern" überhaupt etwas eingegeben ist und wenn nicht ggf. ein Default-Logo ausspielen oder eben gar kein Markup für ein IMG-Tag.

Ich hinterlege jetzt mal ein eigenes Logo, dann ist der "Bug" behoben bei mir und auch klar, warum das nicht überall auftritt :-)

Viele Grüße und vielen Dank für deinen wirklich immer sehr schnellen Antworten.
Benutzeravatar
mirko
Beiträge: 22869
Registriert: 25.11.2001, 15:14
Wohnort: Leipzig
Kontaktdaten:

Re: Cross-Site Request Forgery

Beitrag von mirko »

In der index.php wird das Cookie gelöscht, falls es existiert, das ist die 1. Seite, die man immer aufruft. Meldet man sich an, wird das Cookie gesetzt und bleibt die ganze Session gesetzt, ist ein Session-Cookie. Nach der Anmeldung wird am Ende der Datei login.php bzw. in Datei csrf.inc.php das Cookie gesetzt.
MichaelF
Beiträge: 11
Registriert: 28.03.2008, 08:30

Re: Cross-Site Request Forgery

Beitrag von MichaelF »

Die Entwicklertools etc. kenne ich natürlich. Bin ja selbst Entwickler ;-)

Auf dem Server laufen noch zig andere Installationen, alle ohne Probleme. Insofern ist es sicher nichts was an der Konfiguration des Servers etc. liegt.

Wundert mich das dies sonst bei niemanden auftritt, oder die haben das CSRF einfach auch abgeschaltet.

Hab mir den Code nochmal angeschaut und bisserl herum gespielt:

Also gesetzt wird das Cookie schon (!), ich hab es ganz kurz aufblinken gesehen. Aber es wird dann auch sofort wieder gelöscht. Somit stimmen die ganzen Config-Settings.

Gelöscht wird dies in der index.php hier:

Code: Alles auswählen

  if(isset($_COOKIE[SMLSWM_TOKEN_COOKIE_NAME])){
    setcookie(SMLSWM_TOKEN_COOKIE_NAME,"", time()-3600);
    unset ($_COOKIE[SMLSWM_TOKEN_COOKIE_NAME]);
  }
Nimmt man diesen Code raus, dann bleibt der Cookie erhalten und die Seite läuft einwandfrei (und es findet sich in jeder Seite das hidden-Field).

Hab jetzt ehrlich gesagt nicht weiter geprüft wie/was zusammen hängt, dafür ist mir die Codestruktur zu unbekannt und mir fehlt da leider auch die Zeit mich da einzudebuggen. Aber etwas seltsam mutet es schon an, dass der Cookie hier wieder gelöscht wird nachdem er zuvor in der Function _ _LRJDJ gesetzt wurde.

Vielleicht ist hier mein Setup einfach etwas zu modern, ich weiß nicht auf was für einen Setup du das sonst laufen lässt.
Ich habe mit PHP8.0-fpm und nginx schon ein Setup was nicht jeder hat und was durch und durch auf High-Performance getrimmt ist.
Aber eigentlich sollte es da keinen Unterschied machen ob das auf einem Apache mit mod-php läuft oder doch etwas advanced.

Ich lass die zwei Zeilen bei mir jetzt mal auskommentiert, dann kann die Kollegin wenigstens im Tool arbeiten.
Vielleicht kannst doch nochmal nen Blick drauf werfen ob sich hier irgend etwas vom Timing odgl. in die Quere kommt?

LG
Michael
Benutzeravatar
mirko
Beiträge: 22869
Registriert: 25.11.2001, 15:14
Wohnort: Leipzig
Kontaktdaten:

Re: Cross-Site Request Forgery

Beitrag von mirko »

Der CKEditor hat zusätzlich noch eine eigene Absicherung, die basiert natürlich auch auf einem Cookie-Abgleich, das ist auch notwendig, damit keiner von außen auf die Dateien zugreifen kann.

Im jeweiligen Browser die Cookie anschauen. Mit Taste F12 kann man die Entwickertools öffnen, die Aufrufe und resultierenden HTML-Code anschauen. Muss man natürlich etwas suchen, um im Quelltext die richtige Stelle zu finden. Beispiel Browser Edge anbei. Unter Netzwerk sieht man die Anfrage des Browsers an den Server und die Cookies, Bild2 im Quelltext der Seite ist als hidden-Feld der Wert. Diese müssen identisch sein. Wird kein Cookie gesendet, akzeptiert der Browser keine Cookies oder die werden blockiert.
Dateianhänge
Bild1.png
Bild1.png (68.66 KiB) 434 mal betrachtet
Bild2.png
Bild2.png (56.15 KiB) 434 mal betrachtet
MichaelF
Beiträge: 11
Registriert: 28.03.2008, 08:30

Re: Cross-Site Request Forgery

Beitrag von MichaelF »

Gut, das Cookie wird definitiv nicht erzeugt. Es existiert hier nur der Cookie für die PHPSession.

Javascript Fehler sind keine aufgetreten und auch sonst sind keine Plugins da, die dies negativ beeinflussen könnten.

Die Domain ist in der config_paths.inc.php gesetzt und stimmt überein mit der aufrufenden.

Ich bin in der Tat etwas ratlos.

PHP hab ich gerade noch auf PHP8 umgestellt, auch keine Veränderung.
Mit
define("NoCSRFProtection", 1);
kann ich das zwar umgehen, stoße dann aber bei der Auswahl der Bilder im CK Editor spätestens auf den nächsten Access Denied Fehler.

Any other ideas?
Benutzeravatar
mirko
Beiträge: 22869
Registriert: 25.11.2001, 15:14
Wohnort: Leipzig
Kontaktdaten:

Re: Cross-Site Request Forgery

Beitrag von mirko »

DoubleSubmitCookieTokenValidator() scheitert, d.h. das Cookie existiert nicht oder hat einen falschen Wert.

In der config_paths.inc.php den http(s)://-Aufruf prüfen, mit dieser Domain muss SuperWebMailer aufgerufen werden, ansonsten übermitteln die Browser nicht die Cookies, die sind aber notwendig. Ebenfalls immer auf die Links in der Oberfläche klicken, nicht im Browser auf "Vorwärts"/"Rückwärts" klicken.

Wie funktioniert die Prüfung?

In die Seite wird in ein hidden-Feld ein Token geschrieben, der Wert steht auch im Cookie. Sendet man das Formular ab oder klickt auf einen Link = Klicks werden alle per HTTP POST per JavaScript übermittelt, wird der hidden-Wert mit dem Cookie-Wert geprüft. Stimmt es nicht überein, bekommt man die Fehlermeldung "Cross-Site Request Forgery (CSRF)", "DoubleSubmitCookieTokenValidator() failed", die weitere Navigation ist unmöglich.

Probleme dabei kann nur der Aufruf über eine falsche Domain machen = Cookie wird nicht übermittelt oder JavaScript-Fehler, die natürlich auch durch Browser-Add-Ins ausgelöst werden können, die muss man deaktivieren.
MichaelF
Beiträge: 11
Registriert: 28.03.2008, 08:30

Re: Cross-Site Request Forgery

Beitrag von MichaelF »

Muss dieses Thema leider wieder hochholen.

Seite der 8er Version habe ich dieses Problem mit Cross-Site Request Forgery.

Browser-Cache ist gelöscht (Local Storage, App-Storage, Cookie) sowie STRG+F5

Einloggen ist möglich, lande auf dem Dashboard (als Admin) und sobald ich etwas anderes wähle bspw. "Emailings anzeigen" kommt dieser Fehler.

Neueste Superwebmailer Version. PHP 7.4 und nginx.

Was muss ich tun um dieses Problem zu lösen?

Ausgelöst wird der Fehler hier (er geht in das erste IF rein, wenn ich das auskommentiere - geht Supermailer erstmal wieder):

Code: Alles auswählen

 if(!defined("ISFROMCKFILEMANAGER")  && !defined("CRONS_PHP") && !defined("API") && !defined("JAVASCRIPT_LOCALIZATION") && !DoubleSubmitCookieTokenV$
      SetHTTPResponseCode(405, "Cross-Site Request Forgery (CSRF) - DoubleSubmitCookieTokenValidator() failed");
      if(function_exists("GetMainTemplate") && !defined("ISFROMCKFILEMANAGER")){
           _JO6L6($INTERFACE_LANGUAGE);
           $_QCLiL = GetMainTemplate(False, False, '', False, "Cross-Site Request Forgery (CSRF)", "DoubleSubmitCookieTokenValidator() failed", 'DIS$
           $_QCLiL = _LPR06($_QCLiL, "<TEXT:ERROR>", "</TEXT:ERROR>", "Cross-Site Request Forgery (CSRF) - DoubleSubmitCookieTokenValidator() failed$
           print $_QCLiL;
         }
         else{
           print "Cross-Site Request Forgery (CSRF) - DoubleSubmitCookieTokenValidator() failed";
         }
      die;
  }
Benutzeravatar
mirko
Beiträge: 22869
Registriert: 25.11.2001, 15:14
Wohnort: Leipzig
Kontaktdaten:

Re: Cross-Site Request Forgery

Beitrag von mirko »

Abgestürzt ist es nicht, sondern die Browser-Session ist angelaufen, z.B. Webserver wurde vom Provider neu gestartet, oder ein Cookies wurde im Browser gelöscht bzw. nicht übermittelt. Probleme mit dem Webserver gab es hier schon: viewtopic.php?f=33&t=13058

CSRF siehe https://de.wikipedia.org/wiki/Cross-Sit ... st-Forgery
Benutzeravatar
FUN-DIVER
Beiträge: 266
Registriert: 07.04.2020, 10:29
Wohnort: Möhrendorf

Cross-Site Request Forgery

Beitrag von FUN-DIVER »

Hallo
beim Versuch ein bearbeitetes Mailing zu speichern ist die Fehlermeldung unten aufgetreten und SWM ist abgestürzt.
2021-01-08 20_26_15-SuperWebMailer - Cross-Site Request Forgery (CSRF)Es ist ein Fehler aufgetreten..png
2021-01-08 20_26_15-SuperWebMailer - Cross-Site Request Forgery (CSRF)Es ist ein Fehler aufgetreten..png (6.63 KiB) 476 mal betrachtet
Abhilfe?
Antworten