index.html enthält plötzlich Malware
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
benutzen
benutzer
code
datei
datenbank
datum
eingabe
eintrag
entfernen
formular
frage
index
login
mitglied
problem
rang
senden
text
url
zahl
-
Hallo Leute,
ich hatte mit css, html, php und mysql eine Internetseite für einen Clan erstellt. Die mysql Datenbank wurde benutzt um eine Tabelle aller Mitglieder zu verwalten und anzuzeigen. Kein Login System oder ähnliches. Neue Mitglieder wurden über ein einfaches HTML Formular via php zu dieser mysql Datenbank hinzugefügt. Das Formular war nirgendwo verlinkt und nur ich hatte die Adresse.
Als einzige Sicherheitsmaßnahme habe ich die mysql_connect Login Daten in eine separate php datei gepackt und in die eigentliche Seite nur includiert.
Jetzt ist es passiert, das mir google gemeldet hat, dass meine Seite mit Malware belastet ist und alle besucher einen Warnhinweis eingeblendet bekommen. Als ich die index.html per FTP auf meinen PC gezogen habe wurde Sie auch direkt von meinem Antivirenprogramm gelöscht.
Jetzt Frage ich mich wie es dem "hacker" möglich war meine index.html zu verändern? Das er meine Zugangsdaten geknackt hatte schließe ich eigentlich aus weil ich übertrieben lange Passwörter benutze. Einzige Eingabemöglichkeit wäre das oben beschriebene HTML Formular zum hinzufügen von Benutzern. Kann man über sowas Schadcode einspeisen der nicht nur die Datenbank sondern den ganzen Webspace (index.html) ändert?
Wie kann ich mich gegen so einen Vorfall schützen? -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Wenn du die Eingaben aus dem Formular unverändert verwendest, dann ist das eine riesige Sicherheitslücke. Gleiches gilt natürlich für die Verwendung von URL-Parametern (also GET-Variablen), die du vielleicht auf manchen Seiten verwendest. Informier dich mal über XSS.
Dass Passwörter geknackt werden, ist sehr unwahrscheinlich. Am ehesten könntest du unvorsichtig mit Zugangsdaten umgegangen sein (z.B. Passwort in einer TXT-Datei gespeichert oder ähnliches). -
Vielen Dank für deine Antwort ich werde mich mal in Cross-Site-Scripting einlesen. Also ist es damit möglich Dateien auf dem Webspace zu verändern?
-
Wenn es damit möglich ist, irgendwie php-Code einzuschleusen, dann kann man mit dem Webspace machen was man will. Bei dynamischen Webseiten reicht in der Regel aber einfach der Schadcode in der Datenbank, welcher dann auf der Seite eingebunden wird.
-
Ein paar kleine Tipps, wenn du etwas vom Nutzer eingegebenes in deinem Script auswertest(PHP Tipps):
Du solltest auf jeden fall alle html Codes "entfernen":
htmlentities() oder htmlspecialchars() oder ganz weg: strip_tags()
(Mit entfernen meine ich sich vor Code-Einschleusung zu schützen, ja strip_tags kann Code unfreiwillig zerstören, deshalb nur bei Usereingaben wie zB Username, Passwort oÄ wenn überhaupt benutzen)
Dann MySQL Code Weg:
mysql_real_escape_string
oder etwas ähnliches (mysqli benutzen)
Jetzt alle URLs absichern:
urlencode()
(Das dient einfach nur der Fehlervorbeugung, bei zB Texten über GET)
usw. Es gibt bei Google noch viele weitere Tipps um deine Seite gegen Schadcode Einschleusung abzusichern.
Generell gilt: Traue niemals dem Benutzer ^^
Edit: Missverständnisse in () geklärt
Beitrag zuletzt geändert: 11.12.2012 16:13:43 von gaestefun -
Zeig doch mal deinen Quellcode, dann kann man dir auch genauer Sicherheitslücken zeigen. So ist das bis jetzt reines Rätselraten.
gaestefun schrieb:
Jetzt alle URLs absichern:
urlencode()
w00t
URLs werden nicht "gesichert", sondern alle nicht-alphanumerischen Zeichen (außer -_) kodiert, damit sie keine Probleme bei der Verarbeitung machen. Ein User-Agent kann mit URL-kodierten Links problemlos arbeiten, wobei ihm Umlaute in der URL Probleme machen könnten. Für einfache Sachen wie example.com?benutzer=123 ist die Funktion sowieso nicht nötig.
Du solltest auf jeden fall alle html Codes entfernen:
htmlentities() und htmlspecialchars() oder ganz weg: strip_tags()
Die ersten beiden entfernen überhaupt keinen Code, und strip_tags kann Texte kaputt machen->
Bsp:" <edit>XYZ ist auch noch wichtig</edit>" wäre dann weg.
htmlspecialchars () reicht vollkommen, wichtig ist aber das Flag ENT_QUOTES und die Kodierung zu setzen.
Beitrag zuletzt geändert: 10.12.2012 22:44:09 von chatter -
Ich setze mich jetzt daran den Code zu überarbeiten. Hier wie gewünscht der bisherige Code. Ich bin absoluter Anfänger und bastle es mir aus Tutorials und Vorlagen.
Das html Formular zur Eingabe der Daten<.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <title>Mitglied hinzufügen</title> </head> <body> <h1>Mitglied hinzufügen</h1> <form action="senden.php" method="post"> <p>Stats:<br><input name="stats" type="text" size="60" maxlength="250"></p> <p>Name:<br><input name="name" type="text" size="60" maxlength="250"></p> <p>Rang:<br> <select name="rang" size="3"> <option>Testrang1</option> <option>Testrang2</option> <option>Testrang3</option> </select> </p> <input type="submit" value="OK"> </form> </body> </html>
Die senden.php um die Daten in die Datenbank einzutragen:
<?php include("sqlconnect.php"); ?> <?php $stats = $_POST["stats"]; $name = $_POST["name"]; $rang = $_POST["rang"]; ?> <?php $eintrag = "INSERT INTO testdatenbank (stats, name, rang) VALUES ('$stats', '$name', '$rang')" or die ("Nicht geklappt"); ?> <?php $eintragen = mysql_query($eintrag); ?>
Unter "stats" wird ein Link zu einem externen Profil des Mitglieds eingefügt, Name und Rang sind einfache Texteingaben.
Wie gesagt ist dieses Eingabeformular nicht für den einfachen Benutzer gedacht, sondern nur für mich um neue Benutzer in die Datenbank einzufügen. -
icekey schrieb:
Wie gesagt ist dieses Eingabeformular nicht für den einfachen Benutzer gedacht, sondern nur für mich um neue Benutzer in die Datenbank einzufügen.
Es ist egal für wen die Eingabe ist, sie muss validiert werden. Das heißt, du musst prüfen, ob das was kommt auch das ist, was du erwartest. Zahlen mit intval() zu zahlen, und Texte mindestens mit mysql_real_escape_string() nachbearbeiten. Also sollte deine senden.php so aussehen:
$stats = mysql_real_escape_string( $_POST["stats"] ); $name = mysql_real_escape_string( $_POST["name"] ); $rang = mysql_real_escape_string( $_POST["rang"] );
Mindestens. Und jetzt musst du überlegen: Ist der Rang nur eine Zahl? Dann statt mysql_real_escape_string lieber ein intval(). Kann der Name auch HTML Tags enthalten? Wenn nein, dann auch ein strip_tags() anwenden.
Wenn du fragen hast, dann stell sie hier jederzeit. Bei solchen Themen ist es wichtig, dass man gründlich ist, und um das zu werden oder zu lernen hilft es sehr, sich mit anderen auszutauschen. Und dafür ist dieses Forum perfekt.
Also nochmal, alles an GPC (Also GET, POST, COOKIE) Werten, also alles was vom User kommt, egal ob du das bist, muss kontrolliert werden. Es könnte immer ein Böser Bub dahinter stecken, der sich nur mal an deinen PC setzt weil er bei dir zu besuch ist, und du zufällig noch eingeloggt bist.
Liebe Grüße -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage