現在、私はコードレビュープロセスで働いています。パス操作の脆弱性を格下げすることに疑いはほとんどありません。パスの一部はすでにハードコードされており、拡張子が付いています
public class ReadFile {
public static void main(String args[]) throws IOException {
String fname=args[0];
fname="C:\\Users\\kutrivedi\\Desktop\\Ref\\"+fname+".txt";
BufferedReader br = new BufferedReader(new FileReader(fname));
for (String line; (line = br.readLine()) != null;) {
System.out.print(line);
}
br.close();
}
}
質問:
1)悪用は可能ですか?
2)はいの場合、攻撃者はその機能をどのように利用しますか?
3)開発者がディレクトリを書き込んだときに、バックディレクトリに移動するペイロードはありますか?
よろしくお願いします
このコードを悪用することは可能ですか?
はい。
攻撃者はこれをどのように利用できますか?
パストラバーサルの脆弱性により、攻撃者は開発者が意図していないファイルを選択することができます。
たとえば、プログラムにはハードコーディングされたパス"C:\\Users\\kutrivedi\\Desktop\\Ref\\" + input + ".txt"
があります。入力としてfoo
を入力した場合、結果のファイルはC:\\Users\\kutrivedi\\Desktop\\Ref\\foo.txt
になります。
もちろん、foo\\bar
のように複数のWordを追加することもできます。その場合、代わりに次のファイルが読み取られます。C:\\Users\\kutrivedi\\Desktop\\Ref\\foo\\bar.txt
したがって、\\
を追加するだけで、ファイル構造をより深くトラバースできます。
攻撃者はファイルシステムをトラバースできますか?
私も、疑似ディレクトリ..
を使用してそれを行うことができます。すべてのディレクトリには、親を指す..
という疑似エントリがあります。そのため、..\\foo
と入力すると、次のパスがC:\\Users\\kutrivedi\\Desktop\\Ref\\..\\foo.txt
として作成され、C:\\Users\\kutrivedi\\Desktop\\foo.txt
に解決されます。
たとえば、ペイロードが..\\..\\..\\..\\foo
の場合、C:\\foo.txt
を読み取ります。
.txt
拡張子が付いている限り、さらに進んで任意のファイルを印刷できます。このコードはおそらくJavaで記述されており、Javaは\0
文字で文字列を終了しないため、拡張をスキップするために文字列を早く終了する簡単な方法はありません。
ただし、プログラミング言語がnullで終了する文字列に基づいて構築されている場合、プロセスがファイルを読み取る権限を持っている限り、ペイロードは任意のファイルも読み取ることができます。
..\\..\\..\\..\\Windows\\System32\\config\\SAM\0
はC:\\Windows\\System32\\config\\SAM
になります。
これをどのように修正できますか?
最も簡単な方法は、パスを処理するライブラリまたは組み込みフレームワークを使用することです。ほとんどのライブラリには、ディレクトリ構造の内部または外部に何かがあるかどうかを確認するチェックがあるため、これらのチェックを使用して、取得するペイロードがアクセスすべきでないファイルにアクセスしようとしているかどうかを確認できます。