Heim  >  Artikel  >  Backend-Entwicklung  >  Sicherheitslücke beim Hochladen beliebiger PHP-Dateien

Sicherheitslücke beim Hochladen beliebiger PHP-Dateien

伊谢尔伦
伊谢尔伦Original
2016-12-02 09:56:432903Durchsuche

Details zur Sicherheitslücke:

Diese Sicherheitslücke besteht in einer sehr häufig verwendeten Funktion in PHP: move_uploaded_files. Entwickler verwenden immer diese Funktion, um hochgeladene Dateien zu verschieben. Diese Funktion prüft, ob es sich bei der hochgeladenen Datei um eine legale Datei handelt (unabhängig davon, ob sie über den HTTP-Post-Mechanismus hochgeladen wird). Wenn es sich um eine legale Datei handelt, muss sie im angegebenen Verzeichnis abgelegt werden.

Beispiel:

move_uploaded_file ( string $filename , string $destination ) Das Problem hierbei ist, dass Nullzeichen in den Dateinamen eingefügt werden können (diese Sicherheitslücke wurde schon oft behoben, z CVE-2006 -7243) können Angreifer durch das Einfügen von Nullzeichen beliebige Dateien hochladen, was zu Sicherheitslücken bei der Remotecodeausführung usw. führt.

Ich verwende DVWA, um dieses Beispiel zu demonstrieren. Die höchste Frage in DVWA ist aus verschiedenen Gründen nicht einfach zu bestehen. Sie soll Entwicklern sagen, wie sie eine sicherere Datei-Upload-Komponente entwickeln können. Schauen wir uns dieses Beispiel an:

Code-Snippet:

$uploaded_name = $_FILES['uploaded']['name'];
$uploaded_ext = substr($uploaded_name, strrpos($uploaded_name, '.') + 1); $uploaded_size = $_FILES['uploaded']['size'];
if (($uploaded_ext == "jpg" || $uploaded_ext == "JPG " || $uploaded_ext == "jpeg" || $uploaded_ext == "JPEG") && ($uploaded_size < 100000)){ if(!move_uploaded_file($_FILES['uploaded']['tmp_name'], $target_path )) {
$html .= '';
$html .= 'Ihr Bild wurde nicht hochgeladen.';
$html .= '';🎜>else {
$html .= $target_path . ' erfolgreich hochgeladen!';
.
.

Dieser Code weist viele Schwachstellen wie XSCH, XSS usw. auf, aber es gibt keine schwerwiegenden Schwachstellen wie RCE, weil Ab PHP 5.3.1 wurde das Problem mit Nullzeichen behoben. Das Problem hierbei ist, dass DVWA den vom Benutzer hochgeladenen Namensparameter an die Funktion move_upload_file() übergibt, sodass die von PHP ausgeführte Operation möglicherweise wie folgt aussieht:

move_uploaded_file($_FILES['name']['tmp_name '],"/file.phpx00.jpg");Dies sollte eine Datei mit dem Namen file.phpx00.jpg erstellen, aber die tatsächlich erstellte Datei ist file.php.

Auf diese Weise wird die Überprüfung des Suffixnamens im Code umgangen, und es stellt sich heraus, dass viele andere Funktionen in der GD-Bibliothek ebenfalls dieses Problem haben (z. B. getimagesize(), imagecreatefromjpeg()...). .etc.), können Sie dieses Beispiel sehen.

Wenn die PHP-Version Ihres Computers 5.4.39, 5.5.x – 5.5.23 oder 5.6.x – 5.6.7 ist, können Sie das in diesem Artikel beschriebene Problem lösen, indem Sie prüfen, ob x00 Zeichen vorhanden sind das Dateinamenproblem.

Sicherheitsempfehlung Wenn diese Sicherheitslücke auf Ihrem Computer besteht, wird empfohlen, eine zufällige Zeichenfolge zum Umbenennen des Dateinamens zu verwenden, anstatt den Wert des vom Benutzer hochgeladenen Namensparameters zu verwenden.


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn