SWR3.online: Schwachstelle beim Postbank-Onlinebanking

13. März 2008 Kategorien:

Das Team von SWR3.online hat im Onlinebanking-System der Postbank eine Schwachstelle in der Session-Implementierung gefunden, die so natürlich nicht sein darf. Aber deswegen schreibe ich gar nicht diesen Beitrag :)

Die Frage beim Auffinden von Schwachstellen ist ja immer, wann man diese in welcher Form veröffentlicht. Der SWR hat sich dazu entschieden die Schwachstelle vor der Behebung zu veröffentlichen. Details zur Lücke sind mittlerweile, warum auch immer, bei heise.de zu finden. So sollte es ja eigentlich nicht sein. Ein “braver” Finder, sollte solche Fehler erst nach angemessener Zeit nach der Information an den Hersteller bzw. Betreiber veröffentlichen und im Idealfall erst dann, wenn die Schwachstelle gefixt ist. Eine allgemeine Richtlinie gibt es hier IMHO nicht, das zeigt auch dieses sehr interessante Diskussionsverfolgung.

Wir stoßen beim täglichen Recherchieren im Web regelmäßig auf diverse Schwachstellen in Webanwendungen (und anderen Anwendungen und Systemen..). Daraufhin wird immer der Betreiber informiert (wohlgemerkt erhält er immer alle notwendingen Informationen, ohne ihm dabei unter die Nase zu reiben, dass wir gegenüber einen ausgewachsenen und bezahlten Audit auch nicht abgeneigt wären :) ). Im Falle einer COTS-Anwendung wird entsprechend auch der Hersteller bzw. das Security-Team des Projekts informiert.

Just beim SWR3 haben wir bei einer älteren Version der Webseite eine mehr als pikante Schwachstelle gefunden. Sämtliche Downloads, z. B. MP3s, wurden nicht direkt verlinkt, sondern über ein Script namen ladelade.php bereitgestellt. Dieses Script hatte es in sich. Indem man die URL ladelade.php?datei= veränderte, konnte man jede für den Webserver-Prozess erreichbare Datei auf dem Server im Quelltext laden. So war der Download der Datei ladelade.php über den Aufruf ladelade.php?datei=ladelade.php möglich.
Dem Download-Service ;) von SWR3 hätte man sicherlich auch viele weitere interessante Dateien entlocken können.

Wir haben den SWR direkt nach Finden der Lücke informiert, woraufhin das Script halbherzig gefixt wurde. Der simple Directory Traversal mit ../../, um aus dem Webroot auszubrechen wurde nun mit einer Weiterleitung zu einer (mittlerweile nicht mehr erreichbaren) Seite mit dem Wortlaut des §202a StGB quittiert. Innerhalb des Webroot war weiterhin alles im Quelltext lesbar. Auch hierauf haben wir hingewiesen und abermals wurde halbherzig gefixt. Mittlerweile scheint der Download-Service nur noch die Dateien auszuliefern die er soll, daher sollte die Veröffentlichung hier kein Problem mehr darstellen.

Und so sah das gute Stück zu Beginn aus. Man beachte den Kommentar am Anfang des Programmierers. Wie recht er doch hatte..

ERROR_REPORTING (E_ALL);

############################################################
### Script zum forcierten Download von Dateien aller Art ###
############################################################

if (!empty($_GET['datei'])) { $datei = rawurldecode($_GET['datei']); } else { $datei = ""; }
// benötigt für IE, sonst ignoriert das Idiotenprogramm das
if(ini_get('zlib.output_compression')) {
       ini_set('zlib.output_compression', 'Off');
}

$file_extension = strtolower(substr(strrchr($datei,"."),1));
if( $datei != "" ) {
      $datei = "/home/s/serverle.info/public_html" . $datei;
      if (file_exists($datei)) {
          switch( $file_extension ) {
             case "pdf": $ctype="application/pdf"; break;
             case "exe": $ctype="application/octet-stream"; break;
             case "zip": $ctype="application/zip"; break;
             case "doc": $ctype="application/msword"; break;
             case "xls": $ctype="application/vnd.ms-excel"; break;
             case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
             case "gif": $ctype="image/gif"; break;
             case "png": $ctype="image/png"; break;
             case "mp3": $ctype="audio/x-mp3"; break;
             case "jpeg":
             case "jpg": $ctype="image/jpg"; break;
             default: $ctype="application/force-download";
          }
          header("Pragma: public"); // muss so sein
          header("Expires: 0");
          header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
          header("Cache-Control: private",false); // required for certain browsers
          header("Content-Type: $ctype");
          header("Content-Disposition: attachment; filename=".basename($datei).";" );
          header("Content-Transfer-Encoding: binary");
          header("Content-Length: ".filesize($datei));
          readfile("$datei");
      } else {
          echo $datei . "geht nix";
      }
}

exit();

Achja: Diesen Code natürlich bitte nicht kopieren und auf den Webserver stellen. Danke :)

/gt

Einen Kommentar schreiben