glob:を使用して、open_basedirをバイパスする

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のブログでは言ったことが参照できます:
このため、disable_functionsymlink()を追加する必要があります。 これは刑務所を構成し、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()を取り出しました。 次にコードを書く:
  //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/ディレクトリ下のサブディレクトリを取得できました。


クリエイティブ・コモンズ・ライセンス
この 作品 は クリエイティブ・コモンズ 表示 - 非営利 - 継承 3.0 非移植 ライセンスの下に提供されています。

$_SERVER['SCRIPT_NAME']変数のインジェクション

0x00 概要 $_SERVER['SCRIPT_NAME']はPHP用の1つ組み込み変数です。ここでは、使用時には、一般的にフィルタリングされません。 fuzzの後、この変数の取得は実際に問題がある、予期しないデータが導入されます。 一部のWebサーバ...