Heim >Backend-Entwicklung >PHP-Tutorial >Eine ausführliche Analyse der Schwachstellen bei der Einbindung von PHP-Dateien
Dieser Artikel vermittelt Ihnen relevantes Wissen über PHP, in dem hauptsächlich verwandte Probleme zu Dateieinschluss-Schwachstellen vorgestellt werden. Der Grund für Dateieinschluss-Schwachstellen liegt darin, dass beim Einführen einer Datei über eine PHP-Funktion der Name der eingehenden Datei nicht angemessen überprüft wurde. Es wurden also unerwartete Dateien bearbeitet. Ich hoffe, dass dies für alle hilfreich sein wird.
Empfohlene Studie: „PHP-Video-Tutorial“
Der Grund für die Sicherheitslücke beim Einschließen von Dateien besteht darin, dass der Name der eingehenden Datei nicht richtig kalibriert wird, wenn eine Datei über eine PHP-Funktion eingeführt wird Daher werden unerwartete Dateien manipuliert, was zu unerwarteten Dateilecks oder sogar zur Einschleusung von Schadcode führen kann.
Die folgenden vier Funktionen verursachen in PHP normalerweise Schwachstellen beim Einbinden von Dateien:
1. Wenn include() zum Einschließen einer Datei verwendet wird, wird die Datei nur dann eingebunden, wenn der Code für die Funktion include() ausgeführt wird. Nur eine Warnung, weitermachen.
2. Die Funktion von include_once() ist dieselbe wie include(). Der Unterschied besteht darin, dass das Programm bei wiederholtem Aufruf derselben Datei diese nur einmal aufruft.
3. require() ruft die Datei sofort auf, sobald das Programm ausgeführt wird. Wenn ein Fehler auftritt, wird eine Fehlermeldung ausgegeben und das Skript beendet.
4. require_once() hat die gleiche Funktion wie require(. ). Der Unterschied besteht darin, dass das Programm bei wiederholtem Aufruf für dieselbe Datei nur einmal aufgerufen wird.
Ein Angreifer kann diese Schwachstelle ausnutzen, um beliebige Dateien zu lesen und an vertrauliche Informationen auf dem Server zu gelangen.
Das Vorhandensein dieser Schwachstelle hat nichts mit der Version zu tun
Wenn beim Senden eines POST-Datenpakets an PHP das Datenpaket einen Dateiblock enthält, egal ob Es liegt im Code, auf den Sie zugreifen oder nicht. Um die Logik des Datei-Uploads zu handhaben, speichert PHP diese Datei in einer temporären Datei (normalerweise /tmp/php [6 zufällige Zeichen]), und der Dateiname ist in $_FILES zu finden Variable. Diese temporäre Datei wird nach Abschluss der Anfrage gelöscht.
Da die phpinfo-Seite gleichzeitig alle Variablen im aktuellen Anforderungskontext ausgibt, können wir, wenn wir ein Datenpaket mit einem Dateiblock an die phpinfo-Seite senden, in der Rückgabe den Inhalt der Variablen $_FILES finden Paket, zu dem natürlich auch der temporäre Dateiname gehört.
Wenn eine Dateieinbindungsschwachstelle keine ausnutzbare Datei finden kann, können Sie diese Methode verwenden, um den temporären Dateinamen zu finden und ihn dann einzubinden.
Allerdings bestehen die Datei mit der Sicherheitslücke und die PHPInfo-Seite normalerweise aus zwei Seiten. Theoretisch müssen wir das Datenpaket zuerst an die PHPInfo-Seite senden, dann den temporären Dateinamen von der zurückgegebenen Seite abgleichen und dann diesen Dateinamen an senden die Datei mit der Schwachstellenseite getshell. Am Ende der ersten Anfrage wird die temporäre Datei gelöscht und die zweite Anfrage kann nicht einbezogen werden.
Zu diesem Zeitpunkt muss der bedingte Wettbewerb verwendet werden:
1) Senden Sie ein Upload-Datenpaket mit Webshell an phpinfo. Der Header, Get und andere Positionen dieses Datenpakets müssen mit Junk-Daten gefüllt sein.
2) phpinfo druckt zu diesem Zeitpunkt alle Daten aus und die Junk-Daten machen phpinfo sehr groß.
3) Die Standardpuffergröße von PHP beträgt 4096, d. h. PHP gibt jedes Mal 4096 Bytes an die Socket-Verbindung zurück.
4) Daher bedienen wir den nativen Socket direkt und lesen jedes Mal 4096 Bytes. Solange die gelesenen Zeichen den temporären Dateinamen enthalten, wird das zweite Datenpaket sofort gesendet.
5) Zu diesem Zeitpunkt ist die Socket-Verbindung des ersten Datenpakets noch nicht beendet, aber PHP gibt jedes Mal weiterhin 4096 Byte aus, sodass die temporäre Datei nicht gelöscht wurde.
6) Wir können diesen Zeitunterschied nutzen, um die temporäre Datei erfolgreich einzubinden und schließlich Getshell zu erhalten.
Legen Sie eine Whitelist fest.
Empfohlenes Lernen: „PHP-Video-Tutorial“
Das obige ist der detaillierte Inhalt vonEine ausführliche Analyse der Schwachstellen bei der Einbindung von PHP-Dateien. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!