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_functionsymlink()を追加する必要があります。 これは刑務所を構成し、Webshellを取得したハッカーは、制限されたフォルダに閉じ込められます。

0x01 glob://疑似プロトコル

glob://疑似プロトコルの公式文書は以下の通りです:

img

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://を使わずにディレクトリを列挙しようとします。

img

img
img

open_basedirで許可されている範囲内のディレクトリを自由にリストすることは自明です。 ただし、指定されたファイルの範囲を超えた場合、open_basedir restriction in effecの警告を取得する、ディレクトリの列挙は実装できません。

次に、glob://疑似プロトコルを使用してその効果を確認します。

img

ご覧のとおり、glob://疑似プロトコルを使用した後で、/home/ディレクトリ下のサブディレクトリを取得できました。