Hauptmenü

Untermenü

Sicher programmieren - JavaScript-Hacks

1. Die Abschnitte

2. Ein paar schöne Dinge

.. kann man auch anstellen, wenn Eingaben in Formularfeldern nicht genau geprüft werden. Dazu wenden wir jetzt mal zwei einfache JavaScript-Hacks an. Ruft dazu die index.php im Ordner javascript auf. Hier hat unser "Programmierer" ein extrem pisseliges Gästebuch eingebaut, wo Kreti und Pleti etwas hineinschreiben darf. Und diese Nachlässigkeit nutzen wir jetzt aus.

Der Code

... ist beschämenswert. Es werden einfach die Einträge in die Datenbank geschrieben und dann erfolgt eine Weiterleitung auf die list.php, wo dann alle "Beiträge" angezeigt werden.


if ($_POST)
{
  $query 'INSERT INTO gb (name, inhalt) 
          VALUES (\''.$_POST['name'].'\',\''.$_POST['inhalt'].'\')';
  $insert mysql_query ($query);
  if ($insert)
  {
    header('Location: list.php');
  }
}

3. Das erste Beispiel

Gebt einfach mal einen Nickname eurer Wahl ein und dann das Folgende:


<script type="text/javascript">
  body    document.getElementsByTagName("body");
  tabelle body[0].innerHTML;
  alert (tabelle);
</script>


... und zack, bekommt ihr auf der nächsten Seite die komplette Tabelle als alert-Box um die Ohren gehauen. Das ist zwar ärgerlich, aber nicht tragisch. Bevor es weitergeht, solltet ihr erst mal den entsprechenden Eintrag aus der Datenbank löschen, denn der nervt wirklich.

4. Ein schlimmeres Beispiel

Geht jetzt mal zurück zur index.php und tragt im Textfeld folgenden Code ein:


<script type="text/javascript" src="hack.js"></script>


Die hack.js


document.anmeld.onsubmit = function ()
{
  alert (
          'You\'ve been hacked by XHackY!' "\n" + 
          'Your e-mail is: ' document.anmeld.mail.value "\n" +
          'and your password is: ' document.anmeld.pw.value
        );
}

Dieses kleine Script reagiert nur, wenn man sich rechts im Feld anmelden will, um seine Rabatte im Shop zu erhalten. Und schwuppdiwupp, auf einmal meldet sich ein "Hacker" und lässt die Zugangsdaten in einer alert-Box aufploppen. Ach ja, das funktioniert auch, wenn die Datei auf einem externen Server liegt. Und das ist das Gefährliche an dieser Sache. Probiert es mal aus, wenn ihr irgendwo noch Webspace habt. Und passt natürlich den Pfad an.

Die Folgen

Sind technisch gesehen erst mal nicht so schlimm. Dank der Same Origin Policy ist es nicht möglich, die Daten zum Beispiel per Ajax irgendwo abzuspeichern. Auch mit Cookies funktioniert das nicht so einfach. Es gibt allerdings Möglichkeiten, per Cross-Site Scripting oder Cross-Site Request Forgery diese Lücke trotzdem auszunutzen.

ABER!

Wenn so eine Meldung in eurem Shop auftaucht, dann ist Holland in Not. Und die Telefonleitung des Shopbetreibers wird ob des Ansturms von Kundenanrufen mit Sicherheit zusammenbrechen. Vom Imageschaden mal ganz abgesehen.

5. Gegenmaßnahmen

Wenn man ganz auf Nummer sicher gehen will, so sollte man mit htmlspecialchars arbeiten. Dann werden Zeichen wie < entsprechen zu &lt; umgewandelt und man sieht im schlimmsten Fall JavaScript-Code, der aber nicht ausgeführt wird.

Wenn man dagegen HTML-Tags erlauben will, so sollte man zumindest möglichen JavaScript-Code per regulären Ausdruck herausfiltern.


preg_replace('/<script[^>]*>.*?</script>/','',$_POST['inhalt']);

Das ist allerdings nicht der Weisheit letzter Schluss, da man den Code auch "verschlüsseln" kann. Eine einfache Variante ist der Einbau einer so genannten Null Byte Sequenz, also <scr\0ipt type="text/javascript" src="hack.js"></scr\0ipt>. Unter Umständen wird die \0 von System herausgefiltert und man hat wieder korrekten JavaScript-Code.

Weitere Lösungsmöglichkeiten für dieses Problem wären mysql_escape_string oder noch besser mysql_real_escape_string.

zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt