イントロ
私は現在PHPブラックボックス分析を実験していて、有用な情報を見つけることができませんでした。Apacheのバージョンを判別する方法はいくつかありますが、PHP =インターネットはいわゆる "PHPイースターエッグ"しか知らないようです php.net でPHPエラー、廃止された関数、変更ログに関する情報がたくさん見つかりました、しかし、私がここで探しているものに似たものは何も見つかりませんでした(ある種の包括的なリスト、ツール、紙、または少なくともアイデア)。そのため、自転車を再発明する前に、ここで運を試します。
私はいくつかの制限を受け入れなければなりません。今のところ私はエラーベースのテストも受け入れています(PHPエラーメッセージを有効にしないと推測を行うことが難しいため)が、すべてのサーバーでPHPエラーメッセージが有効になっています。
私たちは持っていません:
phpinfo()
expose_php=off
(X-Powered-By
無効))サーバーは安全です-ちょっと男、それはチャック・ノリスに属します-そのため、ゼロデイ、SQLインジェクション、リモートコード実行など、脆弱性の悪用に依存するソリューションはありません。
私たちは持っています:
display_errors=on
)-間違った入力タイプ:foo.php?id[]=1
代わりにfoo.php?id=1
、バグのあるスクリプト、Host/foo.php/foo.php
は、一部のあいまいなEdgeケースで発生することが許可されていますPHPエラー(ファイルのアップロードなど)など).foo.php?id=bar
あるいは単に /foo/bar/
これまでに見つけたもの
推測PHPバージョン:
- several built-in PHP functions found by analysing PHP error messages
→ PHP change logs → check if any of exposed functions is deprecated in some PHP versions
- PHP<5.3.X allows strings to contain null bytes \0
→ problems with include(), copy(), ... (but we don't have such vulnerabilities on that server, e.g. only Alphanumeric input and chars: {.,-_} are allowed, special chars will be replaced with '')
- IF PHP<5.3.0: strlen(Array) = 5
- IF PHP>=7.0.0: casting NaN or infinity to integer = always 0, not more undefined and platform-dependent
- .php3: PHP=3.x.x, .php4: PHP=4.x.x. (trivial)
Phpinfoからの情報の推測(アクセスできない場合):
- foo.php?id=99...99 (large number) → IF response contains:
→ "2 147 483 647" → 32bit system (extra whitespaces for better readability)
→ "9 223 372 036 854 775 807" → 64bit system
- max_post_size VS upload_max_filesize
- number of allowed input parameters:
→ p1[]=1&p2[]=1&... (use fake parameters in some parameter checking loop which doesn't expect wrong input type)
→ e.g. error based detection
- float precision: 2.9999999999999999=3 (16 digits) VS 2.999999999999999=2 (15 digits)
- determine "Timeouts", error based
質問
サーバーのPHP=バージョンを決定し、通常phpinfo()に表示される詳細情報を推測するために一般的な方法で使用できるものは他にありますか(→php.ini、および他の.iniファイル)。
サーバーの応答時間を測定し、使用済みのPHP関数またはPHPバージョンと関連付けることもできますが、その例-PHPスクリプトは非常に複雑になる可能性があるので、そのような方法がどのように機能するかわかりません。
サイドノート
PHPバージョンのエクスプロイトをインクリメントすることにより、既知のPHPエクスプロイトをすべて実装し、サーバーをブルートフォースします(PHP = 5のエクスプロイトの場合.xxは機能しません。より高いPHPバージョン)のために別のエクスプロイトをテストします(私は純粋な理論的可能性について、そして学術研究の文脈でここで話しています)。すべての倫理的および法的問題(ここで心に留めておきます)2つの可能性があります。
a)エクスプロイトの一部は機能し(サーバーはこの理論的なエクスプロイトツールによって、自動ハッキングまたはDoS攻撃されます)、私たちはできるようになります正しいPHPバージョン(ミッション達成)を決定します。
b)すべてのエクスプロイトは失敗します。これは、サーバーに最新のPHPバージョンまたはエクスプロイトを適用できることのみを通知しますここにはない特別なケースのために。
異なるPHPバージョンとランタイムの特性を識別する分類法をどのように構築するかは、ラボを設定し、異なるバージョンのPHPで異なるフレームワークとアプリケーションタイプを実行するなど、簡単に想像できます。応答時間、トラフィックなどを監視します。このプロセスは一般的であり、通常、違いの発見を実質的に自動化できます。PHPは、多くのバージョン固有の識別特性が存在する可能性が高いほど有機的です。
とは言っても、投稿自体が言うように、PHPはスタンドアロンエンティティではありません。分析中のシステムのコンポーネントとして、それは必ずしも1つの小さなピースにすぎません。個別のOS、多数の異なる個別のプログラムをホスト、無限の他のシステムとの接続など.
PHPランタイムで特定された特定の特性は、PHPなしでは実現できないシステムの他の必要な部分のバリエーションによって、多くの点で混乱します。方法PHP=回線上でバイトを配信する特定のバージョンは、LinuxではなくWindowsで実行されているという事実(およびその中に固有のフィンガープリントがある特定のバージョン)によって混乱する可能性があります。
したがって、特に「交絡」の違いに関する他のコンテキストがない限り、この「PHPブラックボックス分析」アクティビティには注意を払います。調査結果は汚染される可能性があります。
関連して、Webサービスのブラックボックス分析は当然のことであり、そのプロセスの貴重な結果は次のようになります-おお、このサービスはPHPで記述されているように見えます。 X、Y、Zのため、OS Blah上のフレームワークW。全体的な分類は非常に価値があります。
他の必要な部分の分類がない場合、コンポーネント固有の識別の試みは、私の経験では、しばしば見当違いです。