ホームページ  >  記事  >  バックエンド開発  >  PHP 経由でファイルを操作する際の open_basedir 制限をバイパスする方法

PHP 経由でファイルを操作する際の open_basedir 制限をバイパスする方法

不言
不言オリジナル
2018-06-11 09:58:042430ブラウズ

この記事では、PHP がファイル操作の open_basedir 制限を回避するための 3 つの方法と関連テクニックを紹介します。興味のある方はぜひ参考にしてください。

0x00 予備知識

open_basedir について

open_basedir は php.ini の設定オプションです

制限される可能性がありますファイルへのユーザーのアクセス範囲を指定された領域にします。

open_basedir=/home/wwwroot/home/web1/:/tmp/ とすると、web1 経由でサーバーにアクセスするユーザーは情報を取得できません。 2 つのディレクトリ home/wwwroot/home/web1/ および /tmp/ の外側にある / ファイルを除くサーバー上にあります。

open_basedir で指定される制限は、実際にはディレクトリ名ではなくプレフィックスであることに注意してください。

例: 「open_basedir = /dir/user」の場合、ディレクトリ「/dir/user」および「/dir/user1」にアクセスできます。したがって、指定したディレクトリのみへのアクセスを制限したい場合は、パス名の末尾にスラッシュを付けます。

シンボリック リンクについて

シンボリック リンクはソフト リンクとも呼ばれます。このファイルには別のファイルのパス名 (絶対パスまたは相対パス)。

パスには任意のファイルまたはディレクトリを指定でき、異なるファイル システムのファイルをリンクできます。シンボル ファイルの読み取りまたは書き込み時には、システムはその操作をソース ファイルに対する操作に自動的に変換します。ただし、リンク ファイルを削除する場合、システムはリンク ファイルのみを削除し、ソース ファイル自体は削除しません。

0x01 コマンド実行機能

システムなどのコマンド実行機能ではopen_basedirの設定が無効なため、コマンド実行機能を利用してアクセス制限を行うことができます。ディレクトリ 。

最初にディレクトリ

/home/puret/test/

を作成し、そのディレクトリ内に abc という内容の新しい 1.txt を作成します。

nano 1.txt

このディレクトリにディレクトリを作成し、b

mkdir b

という名前を付けます。そして、このディレクトリに

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

という内容の 1.php ファイルを作成し、php.ini で open_basedir

を設定します ##open_basedir = /home/puret/test/b/

open_basedir がアクセスを制限するかどうかを確認するために 1.php を実行してみます


実行結果は次のようになります。図

#明らかに、open_basedir で指定されたもの以外のディレクトリ ファイルを直接読み取ることはできません。


次に、システム関数を使用して、open_basedir の制限をバイパスして 1.txt を削除します。


1.php を

## に編集します。 #
<?php
 system("rm -rf ../1.txt");
?>

まずは1.php実行前のファイルの状況を見てみましょう

#1.php実行後

コマンド実行機能により、open_basedir をバイパスしてファイルを削除することに成功しました。

コマンド実行機能は通常 disable_function に制限されているため、制限を回避する他の方法を見つける必要があります。


0x02 symlink() 関数

まずシンボリックリンク関数を理解しましょう

bool symlink ( string $target , string $link )

シンボリックリンク関数は、ターゲットを指す link という名前のシンボリック リンクを確立します。もちろん、通常の状況では、このターゲットは open_basedir に限定されます。
初期のシンボリックリンクは Windows をサポートしていなかったので、私のテスト環境は Linux の下に置かれました。



テストした PHP のバージョンは 5.3.0 です。他のバージョンは自分でテストしてください。


Linux 環境では、シンボリックリンクを介していくつかの論理バイパスを完了でき、これによりディレクトリ間でファイルを操作できるようになります。


まず、/var/www/html/1.php の 1.php の内容を

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

として編集します。次に、 /var/www/ に

#"abc"

という内容の新しい 1.txt ファイルを作成し、open_basedir

# を設定します。 # #open_basedir = /var/www/html/

html ディレクトリ内の php スクリプトを編集して、open_basedir の実行を確認します

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

見てください。

#予想どおり、ファイルにアクセスできません。

先ほど書いたスクリプト 1.php


ファイル 1.txt の内容が正常に実行されたことがわかります。 open_basedir の制限

問題の鍵は


symlink("tmplink/../../1.txt",")エクスプロイト");

現時点では、tmplink はまだシンボリック リンク ファイルであり、それが指すパスは c/d であるため、エクスプロイトが指すパスは

になります。
c/d/../ ../1.txt

このパスは open_basedir の範囲内にあるため、エクスプロイトは正常に作成されました。

その後、tmplink シンボリック リンク ファイルを削除し、tmplink と同じ名前の新しいフォルダーを作成します。このとき、エクスプロイトが指すパスは

です。

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

以上がPHP 経由でファイルを操作する際の open_basedir 制限をバイパスする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。