web-dev-qa-db-ja.com

テストPHPフォームインジェクション

フォームから入力を受け取る非常に小さなPHPアプリを書いています。最初のリビジョンで予想されるように、コードは入力のエスケープやサニタイズを行いません。

_if( $_POST["var"] != "" ) {
    print "Current value: ".$_POST["var"]."\n";
}
_

しかし、PHPコード("; print phpinfo();、 "など)を挿入しようとすると、実行する代わりにエコーバックされます。

htmlspecialcharsaddcslashes、_mysqli_real_escape_string_などを使用して入力をクリーンアップする方法は知っていますが、使用する前に、任意のPHPコード?

私のマシンにはPHP Suhosinパッチがインストールされていることに気づきました(Ubuntu 10.10)-それは私の入力を自動エスケープ/サニタイズしますか?

7
Andrew

そのコードについては、PHPインジェクションを期待していませんが、代わりにクロスサイトスクリプティング(XSS)を検討します。

たとえば、注入してみてください:

<script> alert('woot Security.SE rulez!');</script>
9
AviD

「PHPインジェクション」は、アプリケーションでinclude()、require()、eval()、create_function()、またはインタープリターを呼び出す同様の関数を使用していない限り、不可能です。または、アプリケーションが.php、.phtml、またはその他のPHP登録済みファイル拡張子で終わるPHPのパスにあるファイルに書き込む場合。

ただし、AviDで指摘されているように、この例ではマークアップとスクリプトインジェクションは間違いなく可能です。

「改ざんデータ」をダウンロードしてみてください...これはFirefoxのアドオンであり、Webアプリケーションに対するインジェクション攻撃を驚くほど簡単に実行できます。自分に気づいていない場合に備えて、デフォルトの攻撃もいくつか組み込まれています。

4
Mark E. Haase

ちなみに、stripcslashesはXSSを引き起こす可能性があるため、使用を検討しませんでした。

説明させてください:stripslashes vs stripcslashes

stripslashesは、タイプに関係なくすべてのバックスラッシュを削除します

stripcslashesは、16進文字を除くすべてのバックスラッシュを削除します。したがって、これは、stripcslashesを使用する関数に対して次のようなことを実行してXSS攻撃を実行できることを意味します。

\\x3c\\x73\\x63\\x72\\x69\\x70\\x74\\x3e\\x61\\x6c\\x65\\x72\\x74\\x28\\x27\\x58\\x53\\x53\\x21\\x27\\x29\\x3b\\x3c\\x2f\\x73\\x63\\x72\\x69\\x70\\x74\\x3e

Stripcslashes関数で評価すると、次のようになります。alert( 'XSS!');

これは実際に人気のあるWordpressプラグイン(Platinum SEO <= 1.3.7)内で見つけた脆弱性でした

必要以上の問題を引き起こす可能性があるので、使用する前に、使用している関数を調べてください。

これはaddcslashes()の使用にも当てはまります。たとえば、次のようにして、コードを不要な場所で評価するように強制することができます。

$>php -r 'echo addcslashes("\x41", "A..z");' 
\A   

そして、これは、不正な形式のXSS文字列に使用されている基本的な例です。

> php -r 'echo addcslashes("\x3c\x73\x63\x72\x69\x70\x74\x3e\x61\x6c\x65\x72\x74\x28\x27\x58\x53\x53\x21\x27\x29\x3b\x3c\x2f\x73\x63\x72\x69\x70\x74\x3e", "/");'   
<script>alert('XSS!');<\/script>

ご覧のとおり、それでもアラートは実行されます。

Mehaaseが確認したように、include()、require()、eval()、system()などを使用せずにPHPコードを呼び出す方法はありません)(もしあなたがPHP任意のコード実行)よりもユーザー入力でsystem()を使用しています。

2
DarkMantis