it-swarm.com.de

Warum kann die Datei "Shell.php.jpg" als PHP-Datei ausgeführt werden, "Shell.jpg" jedoch nicht?

Ich lerne über Sicherheitslücken beim Hochladen von Dateien mit DVWA .

Nachdem die Sicherheitsstufe der Website auf Hoch gestellt wurde, überprüft die Website sowohl den Inhaltstyp als auch die Dateierweiterung der Post-Anfrage. Um dies zu umgehen, habe ich die Dateierweiterung in .jpg Geändert und den Dateinamen mit Burp Proxy in geändert Shell.php.jpg Von Shell.jpg, Um die Shell auszuführen.

(changing filename with burp

Es klappt. Was ich nicht verstehe ist, warum es funktioniert. Ich habe gelesen, dass nur das am weitesten rechts stehende Dateierweiterungsmuster als Dateierweiterung behandelt wird. Das muss also bedeuten, dass Shell.php.jpg Als .jpg - Datei behandelt werden sollte, und es wird als solche behandelt - der Upload ist erfolgreich .

Aber warum kann ich diese Datei und keine Shell.jpg - Datei ausführen, wenn die Dateierweiterung gleich geblieben ist und der .php - Teil nur Teil des Dateinamens ist?

root @ kali::~# weevely http://10.0.2.4/dvwa/hackable/uploads/Shell2.php.jpg yuval 
 
 [+] weevely 3.7.0 
 
 [ +] Ziel: [email protected]:/var/www/dvwa/hackable/uploads 
 [+] Sitzung: /root/.weevely/sessions/10.0.2.4/Shell2.php_0.session 
 [+] Shell: System Shell 
 
 [+] Durchsuchen des Dateisystems oder Ausführen von Befehlen startet die Verbindung 
 [+] Zum Ziel. Geben Sie Folgendes ein: help, um weitere Informationen zu erhalten. 
 
 Weevely> id 
 [-] [channel] Die Remote-Skriptausführung löst einen Fehler 500 aus. Überprüfen Sie die Integrität von Skript und Nutzdaten 
 uid = 33 (www-data) gid = 33 (www-data) groups = 33 (www-data) 
 [email protected]:/var/www/dvwa/hackable/uploads $ 

Beispiel für die erwartungsgemäß funktionierende Datei mit dem Namen Shell.php.jpg [Terminal] Die Backdoor-Kommunikation ist fehlgeschlagen. Überprüfen Sie die Verfügbarkeit der URL und das Kennwort

Beispiel für dieselbe Datei, die NICHT wie erwartet funktioniert, mit dem Namen Shell.jpg.

2
Yuval

Shell.php.jpg sollte sein wird als .jpg-Datei behandelt

Sie erforschen DVWA, also bedeutet nicht jeder sollte sein bedeutet ist. Wenn ich raten musste, überprüft das Upload-Skript die Erweiterung der Datei ordnungsgemäß und lässt sie zu, aber der Webserver überprüft sie nicht auf die gleiche Weise und ermöglicht die Ausführung.

Sie können mehr erfahren, indem Sie die Konfigurationsdateien des Webservers (Nginx oder Apache) durchsuchen und nach einem Block suchen, der die Übergabe an den PHP-Parser zur Anforderungsverarbeitung durchführt.

Klärung:

Aber warum kann ich diese Datei und keine Shell.jpg - Datei ausführen, wenn die Dateierweiterung gleich geblieben ist und der .php - Teil nur Teil des Dateinamens ist?

Die Erweiterung besteht nur aus Buchstaben in einem Dateinamen. Sie bestimmen nicht, wie die Datei vom Webserver behandelt wird, sondern vom Webserver. Einer der gängigen Algorithmen ist:

If the requested file name ends with “php”
    Invoke php to handle the request
Else
    Serve the requested file like any other static file
End

Ich vermute, dass in Ihrem Fall requested file name ends with “php” In requested file name contains “.php” Geändert wurde. Sie finden diese Regel in der Konfigurationsdatei des Webservers, der Ihre Anforderungen verarbeitet, und können dies selbst herausfinden.

Aktualisieren:

Dies ist das erwartete und dokumentierte Verhalten von Apache. Ich bin ein bisschen überrascht, aber das ist die Welt, in der wir leben. Verdammt.

In der Konfigurationsdatei /etc/Apache2/mods-enabled/php.conf Registriert die Zeile AddHandler php5-cgi .php Den Handler für .php - Dateien. Alles ist in Ordnung, es sei denn, Sie lesen was AddHandler tut .

Das Erweiterungsargument unterscheidet nicht zwischen Groß- und Kleinschreibung und kann mit oder ohne führenden Punkt angegeben werden. Dateinamen können mehrere Erweiterungen haben und das Erweiterungsargument wird mit jeder von ihnen verglichen.

Sooo ... ja. Natürlich können Dateinamen mehrere Erweiterungen haben. Dies ist die einzige logische Standardeinstellung.

Wenn Sie ein Verrückter sind, der erwartet, dass die Datei nur eine Erweiterung hat, Apache hat die Antwort für Sie :

Wenn Sie möchten, dass nur der letzte durch Punkte getrennte Teil des Dateinamens einem bestimmten Teil der Metadaten zugeordnet wird, dann verwenden Sie nicht die Direktiven Add *.

Sie schlagen hilfreich die Lösung für Ihren seltsamen Wunsch nach einer Verlängerung vor - verwenden Sie einfach Regex. Um also nur .php-Dateien als PHP auszuführen, müssen Sie die AddHandler-Direktive in der php.conf durch ersetzen

<FilesMatch "[^.]+\.php$">
  SetHandler php5-cgi
</FilesMatch>

Abschließend:

  • gesunder Menschenverstand gibt es in Software nicht
  • vertraue niemals den vom Benutzer bereitgestellten Daten
  • speichern Sie bei Bedarf die ursprünglichen Dateinamen in der Datenbank und benennen Sie sie nach dem Hochladen um
  • behandeln Sie Dateinamen wie eine lebende Bombe
7
Andrew Morozko