`

Java写文件时文件名00截断BUG导致的文件上传漏洞及修复

 
阅读更多

Java在上面两种环境写文件时,会因为00截断而无法正确为新生成的文件命名。比如用户需要的用户名abc.jsp .jpg,但经过00截断后,生成的文件的名称变为abc.jsp , 因此我们在涉及到上传的文件名没更改名称或者可自定义目录的时候加以利用

测试环境:
1.windows7(x64)+tomcat7+jdk1.6
2.Linux3.0(ubuntu11.10)(x86)+tomcat7+jdk1.7
Java在上面两种环境写文件时,会因为00截断而无法正确为新生成的文件命名。比如用户需要的用户名abc.jsp .jpg,但经过00截断后,生成的文件的名称变为abc.jsp , 因此我们在涉及到上传的文件名没更改名称或者可自定义目录的时候加以利用。
测试发送的头部数据如下:
POST /simpleUpload/write.jsp HTTP/1.1
Accept: application/x-shockwave-flash, image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
Accept-Language: zh-cn
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
Host: 192.168.200.142:8084
Content-Length: 17
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: JSESSIONID=D2EC5F95AD581EB5FD3A860FC4CE640
 
name=abc.jsp .jpg(注意在上传前,这里的空格需要我们用十六进制编辑器将其变为00)
测试的服务端代码如下:
<%@page import=”java.io.*”%>
<%
    out.clear();
    String filename = request.getParameter(“name”);
    if (filename != null) {
        String path = application.getRealPath(“/”);
        String p=path + “/” + filename;
        File uploadfile = new File(p);
        if (!uploadfile.exists()) {
            uploadfile.createNewFile();
        }
        out.println(“System Name:”+System.getProperty(“os.name”));
        out.println(“1.The information of UploadFile:”);
        if(uploadfile!=null){    
            out.println(”   a.the UploadFile  exists!”);
            out.println(”   b.The path of UploadFile:    “+uploadfile.getAbsolutePath());
            out.println(”   c.The name of UploadFile:    “+uploadfile.getName());
            p=uploadfile.getAbsolutePath().substring(0,uploadfile.getAbsolutePath().length()-5);
            File bugFile=new File(p);
            out.println(“2.The information of BugFile:”);
            if(bugFile.exists()){ 
                out.println(”   a.The BugFile  exists!”);
                out.println(”   b.The path of BugFile:    “+bugFile.getAbsolutePath());
                out.println(”   c.The name of BugFile:   “+bugFile.getName());
            }else{
                out.println(“The BugFile: “+bugFile+”  does’t exist!”);
            }
            File uploadfile2 = new File(p+uploadfile.getAbsolutePath().substring(uploadfile.getAbsolutePath().length()-5));
            out.println(“3.Assure whether the nonexistent  UploadFile exists because of the java API or not:”);
            if(uploadfile2.exists()){
                out.println(”   a.The nonexistent  UploadFile  exists!”);
                out.println(”   b.The path of nonexistent  UploadFile:    “+uploadfile2.getAbsolutePath());
                out.println(”   c.The name of nonexistent  UploadFile:   “+uploadfile2.getName());
            }else{
                out.println(“The nonexistent  UploadFile: “+uploadfile2+” does’t exist!”);
            }
        }else
            out.println(“The UploadFile: “+uploadfile+”  isn’t uploaded successfully!”);
    } else {
        out.println(“Null name!”);
    }
    out.flush();
%>
 
1.在windows7(x64)+tomcat7+jdk1.6环境下提交的数据返回结果的截图:
 
2.在Linux3.0(ubuntu11.10)(x86)+tomcat7+jdk1.7环境下提交的数据返回结果的截图:
 
从上图我们可以看到:
1点成功了,表示文件已经上传成功了,并且文件名abc.jsp00.jpg没变,且java认为这个文件存在的。
2点也成功了,表明 abc.jps存在.
3我们用abc.jsp组全00.jpg去确认这个文件是否存在,结果java认为存在。
注:(这里的00表示16进制字符)
当我们打开对应的目录时,发现只有abc.jsp存在。这说明文件名00截断是JAVA的原因。而不是系统的原因。
为了不让web shell由于这个漏洞而得以上传,推荐你使用fckeditor的方法,用一个正则表达式替换用户可以定义的路径名或者文件名,代码如下
filename = filename.replaceAll(“\\/|\\/|\\||:|\\?|\\*|\”|<|>|\\p{Cntrl}”, “_”);(正则表达中\\p{Cntrl}这个是处理00字符的。)
分享到:
评论

相关推荐

    java导出文件文件名处理

    本文将详细介绍如何在Java中处理导出文件时的文件名问题,确保用户能够正常下载带有中文或其他特殊字符的文件名。 #### 知识点一:理解文件名编码问题 在Web应用中,当服务器向客户端发送文件时,HTTP协议中会包含...

    JAVA根据文件名检索文件

    JAVA根据文件名检索文件JAVA根据文件名检索文件JAVA根据文件名检索文件JAVA根据文件名检索文件JAVA根据文件名检索文件JAVA根据文件名检索文件JAVA根据文件名检索文件

    自动截断长文件名(保留文件后缀)

    在IT行业中,处理文件名有时会遇到一个问题,即文件名过长,这可能导致在某些操作系统或文件系统中出现问题,比如Windows。为了解决这个问题,我们可以采用自动截断长文件名的技术,确保它们适应特定的限制,同时...

    java操作文件,得到文件名,大小,时间,及修改时间

    java操作文件,得到文件名,大小,时间,及修改时间java操作文件,得到文件名,大小,时间,及修改时间java操作文件,得到文件名,大小,时间,及修改时间

    java遍历文件下面的所有文件并输出文件名

    java遍历文件下面的所有文件并输出文件名 java遍历文件下面的所有文件并输出文件名

    详解关于java文件下载文件名乱码问题解决方案

    下载时因为路径中包含中文文件名乱码是指在下载 Java 文件时,路径中包含中文字符,导致文件名被乱码。这种情况下,可以使用 Java 的 ServletOutputStream 对象对文件名进行编码,具体实现方法如下: ```java ...

    java 根据文件名实现文件搜索

    java实现根据文件名查找本地文件,该程序可直接放在eclipse或者Myeclipse中则可运行,不需要下载其他什么工具包,为开发人员节省了很多时间

    Java实现文件下载并解决中文文件名乱码

    ### Java实现文件下载并解决中文文件名乱码 在日常的Web开发中,经常会遇到需要让用户下载文件的需求,尤其是在企业级应用中。然而,在实际操作过程中可能会遇到一个常见问题:当文件名包含中文字符时,下载后的...

    奇安信代码卫士,文件上传漏洞解决demo

    奇安信代码卫士,文件上传漏洞解决demo; #### 文件上传可以参考以下安全需求进行处理: 1. 服务器配置: (1)将上传目录和上传文件设置为不可执行, 杜绝脚本执行。 (2)应保证服务器安全,避免文件解析漏洞。 2....

    Java中文件选择器JFileChooser.showSaveDialog实现默认文件名的解决方案

    "Java中文件选择器JFileChooser.showSaveDialog实现默认文件名的解决方案" 在 Java 中,文件选择器 JFileChooser 是一个常用的组件,用于选择打开文件或保存文件。然而,在使用 JFileChooser 的时候,我们经常会...

    计算机网络安全中文件上传漏洞及防御措施.pdf

    计算机网络安全中文件上传漏洞及防御措施 计算机网络安全中文件上传漏洞是一种常见的Web安全漏洞,攻击者可以通过上传恶意代码的文件来获取服务器的控制权。为了防御这种攻击,需要对文件上传进行严格的校验检测,...

    Java生成、修改文件夹和文件名.rar

    Java生成、修改文件夹和文件名,Java创建目录或文件夹,并修改、删除、重命名文件夹或文件名称,使用进行的文件操作实例。  super("目录和文件的创建、删除和更名"); //调用父类构造函数  jtfPath=new ...

    获取上传文件的文件名

    js获取file标签上传文件的文件名,可以获取文件名判断文件是否重复 以及对文件上传做控制

    java批量修改文件名

    总的来说,Java批量修改文件名涉及文件I/O操作,需要理解`java.io`和`java.nio.file`包的相关API,同时考虑异常处理和潜在的并发问题。结合第三方库或工具,可以提高代码的可读性和可维护性,满足更复杂的业务需求。

    Java处理中文文件名-压缩中文名字的文件.rar

    总结来说,Java处理中文文件名的关键在于了解编码的使用,并在创建、读取和压缩文件时正确地进行编码和解码。确保始终使用与文件系统和压缩格式兼容的编码,这样可以避免乱码问题。对于非标准格式如RAR,可能需要...

    IIS短文件名泄漏漏洞利用工具下载

    在IIS中存在一种安全漏洞,称为“短文件名泄漏漏洞”,它允许攻击者通过特定的请求来揭示系统中的短文件名,这可能导致敏感信息的泄露,进一步可能被用于入侵系统的其他部分。 ### 漏洞原理 IIS支持DOS时代的8.3...

    java下载时文件名乱码

    在Java编程中,遇到“java下载时文件名乱码”的问题通常是由于编码不一致或处理不当造成的。在处理文件下载时,尤其是从Web服务器下载带有非ASCII字符的文件名时,这种问题尤为常见。让我们深入探讨这个问题,并提供...

    根据文件名检索文件Java实现

    java实现的简单的按照文件名检索文件,输入任意字符串(比如“123”)则返回本地文件中文件名包含字符串“123”的所有文件和文件夹 及其路径,还能分盘符检索

    关于附件上传文件名包含特殊字符的问题解决办法

    - 当用户上传文件时,首先读取文件名。 - 使用一定的编码规则(如URL编码)对文件名进行转码,避免特殊字符引发的问题。 - 将转码后的文件名连同文件一起存储到服务器或数据库中。 2. **下载时解码**: - 用户...

    IIS短文件名漏洞利用工具

    每个长文件名都可以有一个对应的8.3格式的短文件名,形式通常是“目录名~1.FIL”,其中“目录名”是长文件名的前6个字符,“~1”表示这是同一目录下第一个被截断的文件,“FIL”则是文件扩展名的前三个字符。...

Global site tag (gtag.js) - Google Analytics