この記事では、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 を実行してみます
<?php system("rm -rf ../1.txt"); ?>
まずは1.php実行前のファイルの状況を見てみましょう
#1.php実行後
コマンド実行機能により、open_basedir をバイパスしてファイルを削除することに成功しました。
コマンド実行機能は通常 disable_function に制限されているため、制限を回避する他の方法を見つける必要があります。まずシンボリックリンク関数を理解しましょう
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
現時点では、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的Cannot use object of type stdClass as array in错误的解决办法
以上がPHP 経由でファイルを操作する際の open_basedir 制限をバイパスする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。