Hacker-Alarm! unsichere Seite?

Loopo

Admiral
Registriert
Juli 2002
Beiträge
7.617
Für den Kulturverein iPunkt habe ich eine Seite samt CMS und Forum programmiert. Heute erhielt ich einen Anruf des Providers, dass offensichtlich jemand Dateien (Scripte und ausführbare Programme) über diese Homepage rauflädt! :eek:

Jetzt wollte ich wissen, wie es möglich ist bzw. wo die Gefahren liegen können und wie ich diese umgehen kann?

Der Login erfolgt über ein normales Formular:
HTML:
<form action="board.php?tpl=checklogin" method="post">
	<input type="hidden" name="lb_saveprofile" value="temp">
	Benutzer:<br>
	<input type="text" name="lb_nick"><br>
	Passwort:<br>
	<input type="password" name="lb_password"><br>
	<input type="submit" value="einloggen">
</form>

Anschließend werden in einer MySQL-Datenbank die Werte überprüft.

icon4.gif
Hier besteht natürlich die Gefahr, durch mithören (geht das so einfach?) die unverschlüsselten Zugangsdaten auszulesen

Die Benutzer-Daten für das Forum werden für die ganze HP benutzt, auch für den administrativen Bereich, der ohne entsprechende User-Rechte (in der MySQL gespeichert) nicht betreten werden kann (soll). In diesem gibt es mehrere Seiten zum Uploaden von Dateien. Das Zielverzeichnis kann hierbei jedoch nicht ausgewählt werden. Alle Uploads kommen in das Verzeichnis Upload oder ein Unterverzeichnis davon.

Die Uploads sehen zB wie folgt aus, Formular:
HTML:
<form action="index.php?p=admin&amp;s=uploads" method="post" enctype="multipart/form-data" name="create_news" id="create_news">
	<input type="hidden" name="upload_file" value="true">
	<input type="file" name="upload" style="width:200px;"><br>
	<input type="submit" value="upload" style="width:200px;">
</form>

PHP-Skript zum speichern der Datei:
PHP:
if ( $_POST['upload_file'] ) {
	// Fehler beim Datei-Upload?
	if ( strlen ( $_FILES['upload']['tmp_name'] ) ) {
		// Datei verschieben
		@ unlink ( 'upload/'.$_FILES['upload']['name'] );
		move_uploaded_file ( $_FILES['upload']['tmp_name'], 'upload/'.$_FILES['upload']['name'] );
		@chmod ( 'upload/'.$_FILES['upload']['name'], 0775 );
	}
}

icon4.gif
hab gerade bemerkt, dass im Cookie die Benutzergruppe gespeichert wird (die den Zugang zum administrativen Bereich ermöglicht) und dieser Wert ohne Kontrolle als richtig genommen wird. Man könnte also durch Ausprobieren aller möglichen Kombinationen hier den Zugang erhalten. Werde hier eine Rückfrage an die Datenbank noch integrieren.


Was meint ihr? Seht ihr wo einen gravierenden Fehler und wie kann man außer durch mithören (nochmal: geht das einfach bei jeder Seite?) hier noch die Zugangsdaten erhaschen?
 
Wenn ich das richtig verstanden habe wird aus dem von dir vorgegebenen Verzeichnis ausgebrochen und woanders hingeladen? Die Post Daten sollte man, wenn nicht ein Cronjob oder ähnliches auf dem Server läuft nicht so einfach erhashen können. Wieso beschränkst du die Dateien nicht einfach. Sprich nur Bilder etc. Bietet zumindestens ein wenig mehr Schutz.
 
Hallo,
es ist schlecht, wenn jemand ein beliebiges script schreiben, es hochladen und auf deinem Server aufrufen kann.
Gruß
Hubik
 
The Prophet schrieb:
Wieso beschränkst du die Dateien nicht einfach. Sprich nur Bilder etc. Bietet zumindestens ein wenig mehr Schutz.
werde ich als zusätzliche Sicherheitsmaßnahme einbauen :rolleyes:

dennoch stellt sich mir die Frage, wie er das angestellt hat :(
 
^^ich hätte gern die Funktion, die die Logindaten mit der DB abgleicht ;)

An der Stelle sind oft einige Sachen nicht verboten...

Außerdem solltest du sessions statt cookies nehmen :)

Und wo wir schon dabei sind auch gleich sämmtliche cgi-dateien beim upload abweisen
 
Zuletzt bearbeitet:
pcw schrieb:
^^ich hätte gern die Funktion, die die Logindaten mit der DB abgleicht ;)

An der Stelle sind oft einige Sachen nicht verboten...
was meinst? :confused_alt:
 
Logindatem müssen doch abgeglichen werden sonst wäre es doch kein Login? Sessions würde ich auch verwenden. Die Holzhammermethode htaccess muss es ja nicht gleich sein ;)
 
Die Login-Daten werden natürlich mit der Datenbank verglich bzw. bei jedem neuen Besuch werden die gespeicherten Cookie-Daten auf ihre Richtigkeit überprüft. Die grobe Überprüfung beim Admin-Bereich war hingegen etwas fahrlässig.
 
Aso, eventuell solltest du prüfen ob die Cookies nicht in fremde Hände gelangt sind.
 
Loopo schrieb:
Die Login-Daten werden natürlich mit der Datenbank verglich bzw. bei jedem neuen Besuch werden die gespeicherten Cookie-Daten auf ihre Richtigkeit überprüft. Die grobe Überprüfung beim Admin-Bereich war hingegen etwas fahrlässig.


Und du passt auch auf, dass dir kein bisschen Usereingabe in dein SQL-Statement gerät?
 
Die Kontrolle im Admin-Bereich ist jetzt überarbeitet und man kann nur mehr ein paar ausgewählte Datei-Endungen hochladen. Die Passwörter der 3 Admins habe ich verändert und phpmyadmin und phpinfo.php habe ich gelöscht.

Ob zu den PCs der anderen beiden wer Zugang hat oder sie Daten weitergegeben haben, werde ich noch klären.

Jetzt habe ich vorerst noch eine Frage: Ich habe ein Verzeichnis mit den Zugriffs-Rechten 0777. Inwiefern ist das gefährlich? Kann man ohne FTP-Zugangsdaten in einem solchen Verzeichnis werken? :rolleyes:

pcw schrieb:
Und du passt auch auf, dass dir kein bisschen Usereingabe in dein SQL-Statement gerät?
Was meinst du? :) Zunächst wird die Benutzergruppe des Benutzers mit der ID soundso (gespeichert im Cookie) mit dem Passwort soundso (ebenfalls gespeichert im Cookie) abgerufen (müssen also beide übereinstimmen) und diese dann kontrolliert, ob sie Zugang zum Admin-Bereich gewährt.
 
Zuletzt bearbeitet:
Naja, wenn du sowas gemacht hast wie
$SQL="SELECT ID FROM TABLE WHERE USER='".addslashes($_POST[USER])"';
kann man dir ja im SQL-Statement so einiges unterschieben...

Deswegen kommt mir an Stellen, wo ich Sicherheit braucht keine Usereingaben in SQL-Statements...

Lieber frag ich alle User ab udn vergleich dann per PHP... Das is da viel sicherer...
 
wieso sicherer? ich prüfe ja zurück mit dem Passwort, wenn ID und Passwort nicht übereinstimmen, gibt's auch kein Resultat - also bei mir sieht das dann ca. so aus:

$SQL="SELECT GRUPPE FROM TABLE WHERE ID='".$_COOKIE[ID]."' AND PASSWORT='".$_COOKIE[PASSWORT]."'";
 
Loopo schrieb:
wieso sicherer? ich prüfe ja zurück mit dem Passwort, wenn ID und Passwort nicht übereinstimmen, gibt's auch kein Resultat - also bei mir sieht das dann ca. so aus:

$SQL="SELECT GRUPPE FROM TABLE WHERE ID='".$_COOKIE[ID]."' AND PASSWORT='".$_COOKIE[PASSWORT]."'";

und wenn och mir jezz in $_COOKIE[ID] folgendes reinschreib:


Was machst du dann?
 
zuerst die Cookie-Werte bzw. Benutzer-Eingaben überprüfen :)
 
Loopo schrieb:
zuerst die Cookie-Werte bzw. Benutzer-Eingaben überprüfen :)

^^das eben war ja nur n ganz einfaches aus den Fingern gesaugtes Beispiel.

ABer anchdem mein Ausbilder mir letztes Jahr vorgeführt hat, wie man SQL-Statements auseinandernehmen kann, hab ich mich dazu entschlossen, grade bei solchen Abfragen wie du sie hier hast, lieber alle USernamen und passwörter auszulesen und sie der Reihe anch durchzugehen.

Gut, bei ner Usertabelle wie der von FB wr das Wahnsinn, aber du hast ja eh ned so viel user, oder?


Und ich mein, sei froh ,dass mySQL pro statement nur ein Befehl akteptiert, sonst kann man dir bei sowas die ganze DB leeren...
 
Brauchst du wirklich 0777? Ansonsten teste mal 0755 sollte in den meisten fällen auch reichen.
 
ne das Skript geht dann komischerweise nicht mehr, obwohls es dann ja eigentlich Besitzer sein sollte :rolleyes:
 
Ja den Mist kenne ich auch ;) Hab aber noch nicht rausgefunden wie man das ändern kann :)
 
der FTP-Benutzer und PHP sind auf vielen Systemen unterschiedliche USer,w eswegen PHP eben ned der Besitzer der hochgeladenen Dateien ist...
 
Zurück
Oben