2013-05-03 8 views
7

私は友人がウェブサイトのモジュールを完成するのを手伝っています。彼のモジュールを見ている私の最初の印象から、私はいくつかの非常に危険なものを見つけましたが、彼はこの方法は安全だと言います。ヌルバイトの脆弱性をテストする

session_start(); 

    if(isset($_POST['foo'])) 
    { 
    $_SESSION['foo'] = $_POST['foo']; 
    } 

    if(isset($_SESSION['foo'])) 
    { 
    $foo['foo'] = $_SESSION['foo']; 
    } 

    if(is_file("inc/". $foo['foo'] . "/bar.php")) { 
    // code 
    } 
    else { 
    // code 
    } 

注:コードの

パートファイル(INC /試験/ bar.php)が存在します。

私は彼のコードをテストしたかった、と私は、次のリクエストを送った:

POST :: FOO =>テスト/ bar.php%00

POST :: FOO =>テスト/ bar.php \ 0

ますcurl_setopt($ chを、CURLOPT_POSTFIELDS、 'FOO =テスト/ bar.php' CHR($ 00)。);

しかし、これらの方法のいずれも機能しませんでした。そのコードは本当に安全ですか?どのようにして誰かがnullバイトを送信してセキュリティをバイパスすることができましたか?彼のコードが安全でないことを私の友人に実証したい。

私は短いで、あなたのコード はやや脆弱で、消毒方法は、このようです、 this解決策を見つけた
+0

私はPHPの専門家ではありませんので、コメントとして残しておきますが、 "../../"のように渡すことはできません。 ./../ "ファイルシステムへの任意のアクセス権を得るか? –

+0

@ChrisThompson最後に「/bar.php」がありますので、../../../bar.phpをすべて確認します – John

+0

あなたは潜在的にアクセスしている場合に脅威になるので、他の_バー。あなたがアクセスするはずのないphp'ファイル –

答えて

5

内ポイズンヌルバイト注射を防ぐために、いくつかの方法があります。 PHP。これらは、バックスラッシュでNULLバイトをエスケープ含め、しかし、そうするための最も推奨される方法は、完全に次のようなコードを使用してバイトを削除することです:

$foo['foo']= str_replace(chr(0), '', $foo['foo']); 

私はまた、専門家ではありませんよヌルバイト攻撃ですが、これは理にかなっています。 さらに詳しい情報here

+1

'$ _POST'の値をセッションに保存するとき、OPはnullバイト文字を置き換えるはずです!これにより、 '$ _SESSION ['foo']'の後で安全でない再利用を防ぐことができます。 – ComFreek

-3

phpはNullバイトに対して非常に有効です。phpはcでビルドされているためです。 cでヌルバイトは文字列の終わりを意味します。

使用するすべての文字列でNullバイトを削除する必要があります。 これは、include en move_uploaded_fileなどのIOベースの関数でさらに重要です。

それがNullバイトを扱うことができる1つの

PHPの関数は、一例であっても上の

str_replace strpos はstrlen

のためのものであるintにキャストしているためであっても(int型) "1 \ 01" vurnableですデータベースquerys。 Mysqlはchar、varchar、およびtextカラムのNullバイトに対してvurnableになります

+1

PHP 5.3.4以降ではこれは当てはまりません。 (これは現在のすべてのバージョンです) – duskwuff

+0

実際には、ここのフォローアップの束はちょうど偽です。 MySQLのように、PHPの文字列処理関数( 'strlen()'など)は、nullバイトを含む文字列で完璧に動作します。 – duskwuff

+0

-1をお寄せいただきありがとうございます。PHP 5.4でもインクルード関数はNullバイトで区切られ、 "hello \ 0there"というSELECTを実行すると表示されます。 –

関連する問題