web-dev-qa-db-ja.com

一部のサーバーでは、ヌル%00が埋め込まれたURLエンコードされたクエリ文字列が壊れます

クエリ文字列の暗号化された文字列をWebページに送信する必要があります。暗号化のために、文字列にヌルが埋め込まれている場合があります。 ?の右側の文字を示す、そのような文字列の短縮例は次のとおりです。

?code=%FE%00%FE

これを使用しているサーバーがいくつかあります。一部のサーバーでは、文字列は$_GET['code']のPHPプログラムに正常に渡され、期待どおりにデコードできます。他のサーバーでは、文字列に%00が存在すると、$_GET['code']文字列が空になります。

これに影響している設定またはアプリケーションレベルの側面はありますか?

クエリ文字列はこのスタックで動作しています:Apache 2.4.10-PHP 5.5.24

このスタックのクエリ文字列は空です:Apache 2.4.12-PHP 5.6.9

1
Jeffrey Simon

@closetnocが示唆するように、URL内のNULL文字の存在攻撃のソースとみなされる可能性があります(ソフトウェアが脆弱であるかどうかは別問題です)サーバーはこれに対して積極的に保護します(ただし、これがcoreで実装されていることは知りません)。 RFC3986-Uniform Resource Identifier(URI):Generic Syntax はこれを具体的に参照します:

ただし、「%00」パーセントエンコーディング(NUL)には特別な処理が必要な場合があり、アプリケーションがコンポーネント内で生データを受信することを期待していない場合は拒否する必要があります。

私のサーバーでは、クエリ文字列に%00を含むURLはmod_securityでアクティブにブロックされ、403 Forbiddenが提供されます!

ただし、binaryデータをtextualデータ用に設計されたクエリ文字列で送信する場合は、base64エンコードされた最初の(プレーンテキストに変換するため)beforeURL(パーセント)で送信用にエンコードされたURL。


私はこれを見つけました PHPバグ#53767レポート (「バグではない」と考えられますが)PHP 5.3.4の2011-01-17からURLパラメーターが値に$_GETが含まれる場合、%00配列から完全に削除されます。

実際、ラスマス自身が返信し、次のように述べています。

再現できません。おそらくこれを行う非標準のPHPコードを実行しています。

1
MrWhite