Java webappでnullバイトインジェクションを行うにはどうすればよいですか?
リクエストパラメータの各バイトを見て、その「バイト」値が 0 であることを検査する必要がありますか? リクエスト パラメータに 0 バイトが潜んでいるとは想像できません。
私の主な目的は、ファイルの保存に使用されるファイル名が十分に安全であることを確認することです。そして今のところ、私は推奨する答えを探していません(たとえば):単語以外のすべての文字をアンダースコアに置き換えます。
Java webappでnullバイトインジェクションを行うにはどうすればよいですか?
リクエストパラメータの各バイトを見て、その「バイト」値が 0 であることを検査する必要がありますか? リクエスト パラメータに 0 バイトが潜んでいるとは想像できません。
私の主な目的は、ファイルの保存に使用されるファイル名が十分に安全であることを確認することです。そして今のところ、私は推奨する答えを探していません(たとえば):単語以外のすべての文字をアンダースコアに置き換えます。
ユーザーが任意の名前でファイルを保存できるようにすることは危険です。ユーザーが提供するとどうなります"../../../WINDOWS/explorer.exe"
か? ファイル名には、無害であることがわかっている文字のみが含まれるように制限する必要があります。
'\0'
無害であるとは知られていません。Javaに関する限り、'\0'
他のキャラクターと同じです。ただし、オペレーティング システムは'\0'
文字列の末尾として解釈する可能性があります。文字列が Java からオペレーティング システムに渡される場合、その異なる解釈により、悪用可能なバグが発生する可能性があります。検討:
if (filename.endsWith(".txt") {
store(filename, data);
}
ここで、ファイル名は「C:\Windows\explorer.exe\0.txt」で、Java では「.txt」で終わりますが、オペレーティング システムでは「.exe」で終わります。
null バイト インジェクションに関心がある理由がわかりません。Java は、文字列が null で終わる文字配列である C/C++ とは異なります。
Web 層からのパラメーターと値をバインドして検証する必要があります。「十分に安全」をどのように定義しますか?
次の 2 つの選択肢があります。
1文字列をスキャンして (最初に char 配列に変換します)、null バイトを探します。
2 Java 8 または Java 7u40 にアップグレードすると、保護されます。(はい、私はそれをテストしました!、動作します!)
1013 年 5 月に Oracle は問題を修正しました: http://bugs.java.com/bugdatabase/view_bug.do?bug_id=8014846
ファイル名のヌルバイトインジェクションは、Java 7 update 40 (2013 年 9 月頃にリリース) で修正されました。そのため、しばらくの間修正されていますが、10 年以上にわたって問題であり、Java の重大な脆弱性でした。修正はここに文書化されています: http://bugs.java.com/bugdatabase/view_bug.do?bug_id=8014846
-デイブ・ウィッチャーズ