7

PHP Webアプリをヌルバイトポイズニングに対して強化しようとしているときに、リクエストで実際にヌルバイトを送信するのにかなりの時間がかかっていることに気付きました。

cURLを使用して、リクエストでnullバイトを送信する方法をようやく見つけることができましたが、非常に奇妙なことに気づきました。nullバイトを含む値のリクエストパラメーターがPHPアプリケーションに到達することはありません。

概念実証としてtest.php、サーバー上に次の名前のファイルを作成しました。

<?php echo json_encode($_GET), PHP_EOL;

このスクリプトへのいくつかのリクエストの結果は次のとおりです。

> curl'http://localhost/test.php?foo = bar&baz = nu%00ll'
{"foo": "bar"}

> curl'http://localhost/test.php?foo = bar&b%00az = null'
{"foo": "bar"、 "b": "null"}

キーがヌルバイトで切り捨てられているようです。値にヌルバイトが含まれている場合、パラメータはリクエスト配列から完全に削除されます。

使用print_r()すると、同様の結果が得られます。

<?php print_r($_GET);
> curl'http://localhost/test.php?foo = bar&baz = nu%00ll'
配列
((
    [foo]=>バー
)。

> curl'http://localhost/test.php?foo = bar&b%00az = null'
配列
((
    [foo]=>バー
    [b] => null
)。

を使用するようにスクリプトとcURLリクエストを変更した場合も、同じことが起こります$_POST

不平を言っているわけではありませんが、各Webサーバーが正しく構成されていることを確認できるように、なぜこれが発生しているのかを知る必要があります。

この動作の原因は何ですか?

> php -v

PHP 5.3.3(cli)(ビルド:2012年7月3日16:40:30)
Copyright(c)1997-2010PHPグループ
Zend Engine v2.3.0、Copyright(c)1998-2010 Zend Technologies
    Suhosin v0.9.29、Copyright(c)2007、by SektionEins GmbH
4

4 に答える 4

3

PHPソースコードの/main/SAPI.cの1010行目を参照してください。

SAPI_API char *sapi_getenv(char *name, size_t name_len TSRMLS_DC)
{
    if (sapi_module.getenv) { 
        char *value, *tmp = sapi_module.getenv(name, name_len TSRMLS_CC);
        if (tmp) {
            value = estrdup(tmp);
        } else {
            return NULL;
        }
        if (sapi_module.input_filter) {
            sapi_module.input_filter(PARSE_ENV, name, &value, strlen(value), NULL TSRMLS_CC);
        }
        return value;
    }
    return NULL;
}

estrdup()は、/ Zend / zend_alloc.cの396行目にある_estrdup()に#definedされ、標準ライブラリ関数strlen()とmemcpy()の両方を使用して入札を行います。基本的に、estrdup()はヌルバイトまでしかコピーしません。

于 2012-09-08T02:58:32.977 に答える
0

最初に Suhosin を無効にします。すでにそれを処理しています。

有効にしている限り、NUL バイトを簡単に挿入することはできません。

于 2012-10-12T18:50:26.197 に答える
0

多くの言語では、ヌル バイトは文字列の終わりを表します。データを 16 進数として送信し、サーバー側で再解釈します。GET はバイナリをサポートしていないと思います。

于 2012-09-07T22:31:24.553 に答える
0

var_dump($your_url);
UGLY/NULL 文字が含まれている場合はTRIM()、最初に試してください。

于 2015-05-11T13:48:06.373 に答える