Heim >Backend-Entwicklung >PHP-Tutorial >Securityoverridehacking-Herausforderung Zusammenfassung der Problemlösungsideen – Fortgeschritten
Ich setze die Arbeit der Zusammenfassung von Problemlösungsideen in der vorherigen Securityoverridehacking-Herausforderung fort und habe dieses Mal „Fortgeschritten“ abgeschlossen. Dabei handelt es sich vor allem um einige Angriffsmethoden auf PHP, die als Grundlage für ein tieferes Verständnis dienen können.
3 Fortgeschritten
3.1 PHP ist scheiße
Unter Verwendung eines typübergreifenden Vergleichs von == in PHP Die daraus resultierenden Lücken. Das ultimative Ziel besteht darin, $input=="0000" zu erstellen. Dies ist einfach zu handhaben. In PHP wird jede numerische Zeichenfolge schließlich zum Vergleich in eine Zahl umgewandelt, sodass die Eingabe eine beliebige Anzahl von Nullen sein kann. Filter fügt jedoch schließlich ein reguläres Urteil <code><span>preg_match</span>
preg_match<span>(</span>
<code><span>"/^[d]{1,}$/D"</span>
(<span>, </span>
<code><span>$input</span>
"/^[d]{1 ,}$/D"<span>)</span>
,
<p>$input<span></span></p>
)
. Das bedeutet, dass es sich nicht um eine reine Zahl handeln kann. Es ist auch relativ einfach: Verwenden Sie einfach die Merkmale 0 (Grundschulwissen: 0 entspricht der negativen Zahl 0) und geben Sie einfach -0 ein. PS: Bezüglich der schwachen Klassenbeurteilungsregeln von PHP http://php.net/manual/en/types.comparisons.php
3.2 Verschleiertes PHP:
Untersuchen Sie, ob die Codelogik unter der Prämisse der Verwirrung geklärt werden kann. Für dieses Problem gibt es keine Abkürzung, eine manuelle Reinigung ist erforderlich. Nach dem Löschen der Kommentare und Semikolons ist die Codemenge tatsächlich nicht groß. Durch Decodieren einiger Teile, die decodiert werden sollen, und direktem Ersetzen derjenigen, die von der Funktion zurückgegeben werden sollen, kann die Codelogik geklärt werden. Nach Abschluss lautet die Codelogik wie folgt:
session_start();
$_u=array();
$_u[0 ]=' SERVER_ADDQUERY_STRINGREQUEST_METHODHTTP_ACCEPT'; //Ein String
$_u[1]='substr'; // substr function
$_u[2]='base64_decode'; §§ §§§§ =preg_split('/(?!\##$$$uu)=/',_SERVER['QUERY_STRING'] // Es kann einfach als Aufteilen durch =
${ verstanden werden "_g_1"} = urldecode($_§§§§§§[0]); // key
${"_g_2"} = _GET[${"_g_1"}]; // value
if(LEVENSHTEIN( ${"_g_1"},${"_g_2"})==0){// Der Schlüssel und der Wert der Parameter müssen gleich sein
validate_result(${"_g_2"});
gelöst_advanced_2"] = true;
header("Location:./");
}
}
echo "Viel Glück. Zurück zur Hauptseite der Challenges.
Bitte beachten Sie, dass Sie nur dann eine Rückmeldung erhalten, wenn Sie diese Challenge lösen.< ;hr />";
highlight_file('code.php');?>
Danach ist es ganz einfach: Erstellen Sie einfach eine URL, die zutrifft die Anforderungen.
3.3 Upload-Umgehung
erfordert, dass Sie das Filterprogramm umgehen und ein PHP hochladen Skript. Allgemeine Ideen: 1 Laden Sie die .php-Datei direkt hoch (fehlgeschlagen). 2 Laden Sie die .php-Datei hoch, ändern Sie jedoch den contentType im Beitragsinhalt in image/jpg (fehlgeschlagen). 3 Laden Sie eine normale JPG-Datei hoch und blenden Sie das PHP-Skript aus (Linux-Befehl cattest.php>>image.jpg oder verwenden Sie ein Tool zum Hinzufügen von Kommentaren. Versuchen Sie, das Bild einfach oder einfarbig zu halten, um zu vermeiden, dass bestimmte Bildzeichen die PHP-Analyse beeinträchtigen.) . Durch den dritten Schritt wird dieses Problem gelöst.
Als nächstes habe ich mich auch mit der Frage beschäftigt, wie man das PHP-Skript in JPG ausführt. Nachdem ich die Informationen konsultiert und selbst experimentiert habe, sind im Grunde nur diese beiden Methoden praktikabler:
· Diese JPG-Datei in eine andere PHP-Datei einbinden oder anfordern
include('images/' . $_GET['test.jpg']);
require('images/' . $_GET['test.jpg']);
include('images/' . $_POST['test.jpg']);
include('images/' . $_POST['test.jpg']);
include('test.jpg');
require('test.jpg');?>
· Stellen Sie den JPG-Formatinterpreter in /etc/apache2/mods-available/php5.conf auf PHP ein
SetHandler application/x-httpd-php
Da im Titel bereits die Existenz einer lokalen Datei-Inclusiong-Schwachstelle erwähnt wurde, ist es sehr einfach, die erste Methode zum Ausführen von PHP-Skripten zu verwenden, bei der es sich grob gesagt um die Verwendung der Injektionsmethode zur Steuerung der Variablen in include oder handelt require , wodurch das Skript ausgeführt wird.
3.4 Lokale Dateieinbindung/WAF-Umgehung
Okay, fangen wir mit der Recherche an auf 3.3 Es funktioniert. 3.4 erfordert die Ausführung der hochgeladenen Datei (der Dateipfad wird angegeben, wenn der Upload in 3.3 erfolgreich ist. Meiner ist /challenges/advanced/uploads/Ac3sk9j.jpg. Ich weiß nicht, ob es dasselbe ist für alle). Wie in 3.3 erwähnt, können Funktionen wie include oder require in PHP verwendet werden, um den PHP-Code in jpg auszuführen. Als ich 3.4 eingab, stellte ich nach Beobachtung fest, dass die URL den Parameter page enthält. Ich habe versucht, ihn nach Belieben zu ändern, und tatsächlich wurde eine Fehlermeldung ausgegeben: test.phpcannot bee. Dann ist das Ziel ganz klar: Ändern Sie die Seitenparameter und geben Sie den Pfad zur JPG-Datei an. Im Nutzungspfad stellt .. den Ordner der oberen Ebene dar, und der relative Pfad kann einfach in ../uploads/Ac3sk9j.jpg geschrieben werden. Beim Versuch einer Anfrage lautet das Ergebnis: uploads/Ac3sk9j.jpg.phpcannot gefunden werden. Es gibt zwei unbefriedigende Punkte: 1) ../ wird herausgefiltert; 2) der Dateiname ist Ac3sk9j.jpg.php statt Ac3sk9j.jpg. Suchen Sie also nach Lösungen:
· Für das Filtern einer bestimmten Zeichenfolge ist String-Ersetzen am einfachsten. Die entsprechende Cracking-Methode ist sehr einfach: Setzen Sie einfach eine Zeichenfolge zusammen, ähnlich wie bei aabb. Nachdem der mittlere AB gefiltert wurde, wird ein neuer AB generiert. Schreiben Sie es hier einfach als….//. Die Filtermethode von stringreplace ist also dieselbe wie none.
· Problem mit dem .php-Suffix. Anscheinend fügt die Website jedem Anforderungspfad ein .php-Suffix hinzu. Google hat nach Umgehungsstrategien gesucht, und es gibt zwei Haupttypen: 1) Verwendung der maximalen Dateipfadlänge von 4096 Bytes und anschließendes Erstellen eines extrem langen Dateipfads durch Hinzufügen einer beliebigen Anzahl von /. Nachdem ich darüber nachgedacht habe, wird geschätzt, dass eine so lange URL direkt vom Server abgefangen wird und 414 zurückgibt. Daher habe ich es nicht versucht. 2) Verwenden Sie den String-Terminator in C und fügen Sie den Terminator vor .php hinzu, um die Kürzung anzuzeigen. Es ist üblicher, es einzunehmen Das Obige stellt eine Zusammenfassung der Ideen zur Problemlösung bei Security-Override-Hackern vor – für Fortgeschrittene, einschließlich Aspekten des Inhalts. Ich hoffe, dass es für Freunde hilfreich sein wird, die an PHP-Tutorials interessiert sind.