Sicherheit in PHP

http://koandagfx.de/index.php?action=<b><u><h1>GAR NICHT GUT</h1>

Das ist meine Seite...
Und den Link hat ein User gepostet...
Wie hat er das gemacht?
Auzug aus der Datei...
PHP:
if(mysql_num_rows($query))
{
	while($row = mysql_fetch_assoc($query)) {
		echo "<div class='div_title' align='center'>" . $row['header'] . "</div>";
		echo "<div class='div_content' align='center'>" . $row['content'] . "<br /><br />geschrieben am: " . $row['date'] . "</div>";
		}
} else {
    die ("Keine Daten in der Tabelle.");
}
 
Die Sicherheitslücke liegt in dem Bereich, wo die $_GET Variable "action" verarbeitet wird. Diesen Auszug bräuchten wir.
 
PHP:
switch($_GET['action']){
PHP:
default: require("inc/news.php"); break;
}

Mh stimmt sieht recht unsicher aus.^^
Aber was kann ich da machen?
Wenn ich mich recht entsinne gibts eine Funktion, komme aber nicht drauf.
 
Das ist nicht wirklich der gesuchte Teil, denn ein nicht vorhandener Fall wird durch das default abgefangen.

Vielmehr müsste in irgendeiner Datei sowas stehen, wie:
echo $_GET['action'];, was dazu führt, dass die Requestvariable einfach ausgegeben wird. Besser ist da schon echo htmlentities($_GET['action']); ([phpf]htmlentities[/phpf], [phpf]htmlspecialchars[/phpf]), aber auch recht unsauber, da der Nutzer immer noch Daten einbringen kann, die so nicht eingebunden werden sollten.

Kann es sein, dass die Überschrift der Sektion auch durch das entsprechende GET-Feld produziert wird? Ganz unsauber!
Alles so statisch wie möglich und so dynamisch wie nötig machen, dann sollten solche Unfeinheiten nicht mehr auftreten. Ein Beispiel könnte sein:

Modul einbinden
PHP:
<?php
switch ( $_GET['action'] ) {
    case "news":
        $title = "Neuigkeiten";
        include "News.php";
        break;
    case "somewhat":
        $title = "Was anderes";
    // ...
    default:
        $title = "N/A";
        include "Default.php";
        break;
}

Ausgabe - Rahmentemplate
PHP:
<?php
echo $title;
// ...
 
Für Fragen ist das PHP-Forum gedacht und nicht dieses Schwerpunktthema, in dem – wie aus dem [post=1254206]Eingangsbeitrag[/post] hervorgeht – keine Fragen zu bestimmten Quellcodes oder Algorithmen gewünscht sind. Diese sind hier zwar auch erlaubt, sollen aber nur zusammen mit einer Lösung des Problems in der Form „Problem ? Ursache ? Lösung“ genannt werden. Für Fragen zu spezifischen Problemen soll bitte ein eigenes Thema eröffnet werden.
 
Zuletzt bearbeitet von einem Moderator:
Sean Coates hat nicht nur diese Sicherheitslücke eher als Gareth Hayes „entdeckt“, sondern beschreibt zusätzlich sowohl die Ursache als auch eine Lösung.

Die Ursache ist nämlich Apaches „AcceptPathInfo“-Feature, mit dem auch nur Teile des Pfads für eine erfolgreiche Abbildung auf das Dateisystem dienen können. So reicht in dem genannten Beispiel bereits das „…/php_self.php“ aus, das auf die gleichnamige Datei abgebildet wird. Der Rest wird in der Umgebungsvariable PATH_INFO gespeichert.
Das Problem hierbei ist wieder einmal der naive Umgang mit den von außen kommenden Benutzereingaben, zu denen auch die URL zählt. Und da PHP_SELF nicht nur den tatsächlichen Pfad zur Skriptdatei sondern auch den PATH_INFO-Teil enthält, der wiederum beliebig sein kann (und so auch Schadcode enthalten kann), ist dieser Variablenwert ebenfalls mit Vorsicht zu behandeln.
 
Ersteinmal, recht herzlichen Dank für diesen interessanten Threat.

Was mich bezüglich des PHP_SELF sehr interessieren würde, wie sieht es denn hier bei Smartys SCRIPT_NAME aus? Wurde das von Seiten der Smarty-Entwickler ausreichend entschärft, oder muss man bei den Templates in denen man SCRIPT_NAME verwendet nacharbeiten?

kind regards
JCB
 
Supi Thread das hier is ^^
Hab mir bislang auch nicht wirklich Gedanken, um die Sicherheit meiner Skripte gemacht...
Andererseits ist mir aufgefallen, dass ich einige Tipps/Ratschläge diese Threads bereits instinktiv befolgt habe ^^

Was mich persönlich dazu interessieren würde, wäre, wie bereits genannt, wie man solche Ausnutzungen von Sicherheitslücken selber nutzen kann...
Wie kann ich selber dafür sorgen, dass ich meine Skripte "missbrauche"?

Die nun folgende Frage ist verständlicherweise richtig dumm und unangebracht, aber ich möchte sie trotzdem stellen:
Könnte mir jemand einen "Beispiel"-Skript nennen, der sämtliche "Löcher" auf meiner Web-Site findet, nutzt und/oder ausbügelt?

Geht mir dabei nich darum, was fertiges zu haben, dass ich benutze, sondern nur darum, dass ich sehe wie man sowas macht... Ne entsprechende Klasse o.ä. zum verwenden auf meiner Site schreibe ich mir dann selber...

[EDIT]:
Was mir grad noch einfällt... Hab ne Idee, die meiner Überlegung nach zumindest theoretisch die Unsicherheit von $_GET-Übergaben in der URL beheben könnte...
Unzwar halt statt $_GET einfach $_POST verwenden...
Aber wie benutze ich in einem Link $_POST!?
Meine Idee dazu:
Anstelle des Links ein unsichtbares Formular, welches die nötigen Daten POSTet...
Und den submit-Button entsprechend formatiert, sodass er aussieht wie ein einfacher Link...

Was haltet ihr von dem Gedanken?
 
Zuletzt bearbeitet:
Zurück