0x00 open_basedir
open_basedir
は、指定されたディレクトリへのユーザアクセスを制限します。 つまり、ユーザーはサーバー上の指定されたディレクトリ以外のファイルにアクセスできません。 クロスサイトを防ぐためによく使用されます。
open_basedir=/home/wwwroot/home/web1/:/tmp/
とすると、web1経由でサーバにアクセスするユーザは、サーバ上で/home/wwwroot/home/web1/
および/tmp/
以外のファイルを取得することはできません。もちろん、物事は絶対的なものではありません。 open_basedirの設定は、
systemなどのコマンド実行関数では無効です。 一般に、コマンド実行を引き起こしやすい
systemやその他の関数は、
disable_functionに置かれます。 したがって、通常の状況下では、
open_basedir の設定はクロスサイトでは依然として非常に役に立ちます。
しかし、ハッカーの精神は何ですか? ハッカーの精神は、不可能なものすべてに挑戦することです。 一連のコマンド実行機能が無効になっていても、open_basedir
が設定されていても、スマートハッカーは目に見えない攻撃ポイントを使用して攻撃を実行します。open_basedir
をバイパスするの最も一般的な使い方はsymlink()
関数を使うことです。 具体的な使用については、私が知っている以上phith0nのブログでは言ったことが参照できます:
https://www.leavesongs.com/bypass-open-basedir-readfile.html
このため、disable_function
にsymlink()
を追加する必要があります。 これは刑務所を構成し、Webshellを取得したハッカーは、制限されたフォルダに閉じ込められます。
0x01 glob://疑似プロトコル
glob://
疑似プロトコルの公式文書は以下の通りです:
glob://
によって、私たちのフィルタ基準を満たしのディレクトリを得ることができます。 問題はここで、glob://
を使用してディレクトリをフィルタリングすることは、open_basedir
によって制限されていません。glob://
マッチングによって、open_basedir
をバイパスする,指定されたディレクトリ以外のディレクトリにアクセスできます。 実際、PHPのglob()
も同様の問題を抱えていました。 しかし、すぐに修正されました。 しかし、glob://
の問題は今日まで続く。
0x02 コード例
私はここでドッカーを使用しています、環境は:nginx / 1.12.2 + PHP 7.1.7(cli)。
バイパス効果をよりよく知るために、disable_function
からscandir()
を取り出しました。 次にコードを書く:
1 | //index.php error_reporting(E_ALL); ini_set('open_basedir', '/home/wwwroot/default/'); eval($_GET['a']); |
glob://
を使わずにディレクトリを列挙しようとします。
open_basedir
で許可されている範囲内のディレクトリを自由にリストすることは自明です。 ただし、指定されたファイルの範囲を超えた場合、open_basedir restriction in effec
の警告を取得する、ディレクトリの列挙は実装できません。
次に、glob://
疑似プロトコルを使用してその効果を確認します。
ご覧のとおり、glob://
疑似プロトコルを使用した後で、/home/
ディレクトリ下のサブディレクトリを取得できました。