Sicher programmieren - JavaScript-Hacks
1. Die Abschnitte
- Einführung
- Informationen
- Desinformation
- GET-Parameter
- POST-Werte
- JavaScript-Hacks
- SQL-Injections Teil 1
- SQL-Injections Teil 2
- Dateiuploads Teil 1
- Dateiuploads Teil 2
- Brute-Force-Attacken
- Webhosting
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 <
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