Heim > Artikel > Backend-Entwicklung > So umgehen Sie open_basedir-Einschränkungen beim Betreiben von Dateien über PHP
Dieser Artikel stellt Ihnen drei Methoden und verwandte Techniken vor, mit denen PHP open_basedir-Einschränkungen beim Betreiben von Dateien umgehen kann. Interessierte Freunde können daraus lernen.
0x00 Vorkenntnisse
Über open_basedir
Symbolische Links, auch Softlinks genannt, sind ein spezieller Dateityp, der den Pfadnamen einer anderen Datei enthält (absoluter Pfad oder relativer Pfad). Weg).open_basedir ist eine Konfigurationsoption in php.ini
Es kann Einschränkungen geben Der Umfang der Aktivitäten von Benutzern, um auf Dateien im angegebenen Bereich zuzugreifen. Unter der Annahme open_basedir=/home/wwwroot/home/web1/:/tmp/ können Benutzer, die über web1 auf den Server zugreifen, nicht Informationen über den Server erhalten, außer / Dateien außerhalb der beiden Verzeichnisse home/wwwroot/home/web1/ und /tmp/.
Beachten Sie, dass es sich bei den mit open_basedir angegebenen Einschränkungen tatsächlich um Präfixe und nicht um Verzeichnisnamen handelt.
Zum Beispiel: Wenn „open_basedir = /dir/user“, dann sind die Verzeichnisse „/dir/user“ und „/dir/user1“ zugänglich. Wenn Sie also den Zugriff nur auf ein bestimmtes Verzeichnis beschränken möchten, beenden Sie den Pfadnamen mit einem Schrägstrich.
Über symbolische Links
0x01 BefehlsausführungsfunktionDer Pfad kann eine beliebige Datei oder ein beliebiges Verzeichnis sein und Dateien in verschiedenen Dateisystemen verknüpfen. Beim Lesen oder Schreiben einer Symboldatei wandelt das System den Vorgang automatisch in einen Vorgang für die Quelldatei um. Beim Löschen einer verknüpften Datei löscht das System jedoch nur die verknüpfte Datei, nicht die Quelldatei selbst.
Da die Einstellung von open_basedir für Befehlsausführungsfunktionen wie System ungültig ist, können wir die Befehlsausführungsfunktion verwenden, um eingeschränkt darauf zuzugreifen Verzeichnisse.
Wir erstellen zunächst ein Verzeichnis
/home/puret/test/und erstellen in diesem Verzeichnis eine neue 1.txt mit dem Inhalt abcnano 1.txt
Erstellen Sie in diesem Verzeichnis ein Verzeichnis und nennen Sie es bmkdir b
Und erstellen Sie in diesem Verzeichnis eine 1.php-Datei mit dem Inhalt
<?php echo file_get_contents("../1.txt"); ?>
und legen Sie unser open_basedir
open_basedir = /home/puret/test/b/
Wir versuchen, 1.php auszuführen, um zu sehen, ob open_basedir unseren Zugriff einschränkt
Ausführungseffekt Wie in gezeigt Aus der Abbildung
geht hervor, dass wir andere Verzeichnisdateien als die von open_basedir angegebenen nicht direkt lesen können.
Als nächstes verwenden wir die Systemfunktion, um zu versuchen, die Einschränkungen von open_basedir zu umgehen, um 1.txt zu löschen
1.php bearbeiten, um
<?php system("rm -rf ../1.txt"); ?>Schauen wir uns zunächst die Dateisituation vor der Ausführung von 1.php an
Nach der Ausführung von 1.php
open_basedir erfolgreich umgangen, um Dateien über die Befehlsausführungsfunktion zu löschen. Da Befehlsausführungsfunktionen im Allgemeinen auf „disable_function“ beschränkt sind, müssen wir andere Möglichkeiten finden, die Einschränkung zu umgehen.
0x02 symlink()-Funktion
Lassen Sie uns zunächst etwas über die Symlink-Funktion lernen
bool symlink ( string $target , string $link )
Die Symlink-Funktion erstellt einen symbolischen Link mit dem Namen „Link“, der auf das Ziel verweist. Unter normalen Umständen ist dieses Ziel natürlich auf open_basedir beschränkt.
Da der frühe Symlink Windows nicht unterstützte, wurde meine Testumgebung auf Linux gesetzt.
Die getestete PHP-Version ist 5.3.0. Bitte testen Sie andere Versionen selbst.
In der Linux-Umgebung können wir einige logische Umgehungen über Symlink durchführen, wodurch wir Dateien über Verzeichnisse hinweg verwalten können.
Wir bearbeiten zuerst den Inhalt von 1.php in /var/www/html/1.php als
<?php mkdir("c"); chdir("c"); mkdir("d"); chdir("d"); chdir(".."); chdir(".."); symlink("c/d","tmplink"); symlink("tmplink/../../1.txt","exploit"); unlink("tmplink"); mkdir("tmplink"); echo file_put_contents("http://127.0.0.1/exploit"); ?>Dann Erstellen Sie eine neue 1.txt-Datei in /var/www/ mit dem Inhalt von
"abc"
einund richten Sie dann unser open_basedir
open_basedir = /var/www/html/
Bearbeiten Sie ein PHP-Skript im HTML-Verzeichnis, um die Ausführung von open_basedir zu überprüfen
<?php file_get_contents("../1.txt"); ?>Schauen Sie mal rein.
Wie erwartet ist auf die Datei kein Zugriff möglich.
Wir führen das gerade geschriebene Skript 1.php aus
Sie können sehen, dass der Inhalt der Datei 1.txt erfolgreich verarbeitet wurde gelesen und entkommen. Die Einschränkung von open_basedir
Der Schlüssel zum Problem liegt in
symlink("tmplink/../../1.txt"," Exploit");
wirdZu diesem Zeitpunkt ist tmplink immer noch eine symbolische Linkdatei und der Pfad, auf den es verweist, ist c/d, sodass der vom Exploit angezeigte Pfad zu
c/d/../ ../1.txt
Da dieser Pfad im Bereich von open_basedir liegt, wurde der Exploit erfolgreich etabliert.
Danach löschen wir die symbolische Linkdatei tmplink und erstellen einen neuen Ordner mit demselben Namen wie tmplink. Zu diesem Zeitpunkt lautet der Pfad, auf den der Exploit zeigt,
tmplink/../../
由于这时候tmplink变成了一个真实存在的文件夹所以tmplink/../../变成了1.txt所在的目录即/var/www/
然后再通过访问符号链接文件exploit即可直接读取到1.txt的文件内容
当然,针对symlink()只需要将它放入disable_function即可解决问题,所以我们需要寻求更多的方法。
0x03 glob伪协议
glob是php自5.3.0版本起开始生效的一个用来筛选目录的伪协议,由于它在筛选目录时是不受open_basedir的制约的,所以我们可以利用它来绕过限制,我们新建一个目录在/var/www/下命名为test
并且在/var/www/html/下新建t.php内容为
<?php $a = "glob:///var/www/test/*.txt"; if ( $b = opendir($a) ) { while ( ($file = readdir($b)) !== false ) { echo "filename:".$file."\n"; } closedir($b); } ?>
执行结果如图:
成功躲过open_basedir的限制读取到了文件。
以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!
相关推荐:
关于ThinkPHP中Common/common.php文件常用函数的功能分析
PHP的Cannot use object of type stdClass as array in错误的解决办法
Das obige ist der detaillierte Inhalt vonSo umgehen Sie open_basedir-Einschränkungen beim Betreiben von Dateien über PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!