Java写文件时文件名\00或者\0截断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.jsp\00.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字符的。)

POSIX字符类(仅应用于us-ascii)

POSIX字符类
\p{Lower}小写字母, [z-z]
\p{Upper}大写字母, [A-Z]
\p{ASCII}ASCII字符, [\x00-\x7f]
\p{Alpha}字母, [\p{Lower}\p{Upper}]
\p{Digit}数字, [0-9]
\p{Alnum}字母或数字, [\p{Alpha}\p{Digit}]
\p{Punct}标点, [!"#$%&'()*+,-./:;<=>?@[]\^_{}|~]
\p{Graph}可见字符, [\p{Alnum}\p{Punct}]
\p{Print}可打印字符, [\p{Graph}\s]
\p{Blank}空格或制表符, [ \t]
\p{Cntrl}控制字符, [\x00-\x1f\x7f]
\p{XDigit}16进制的一位数字, [0-9a-fA-F]
\p{Space}空白符号, [ \t\n\f\r\0x0b]
\P{name}, name是以上名称中的一个. 表示名称name指定字符集外的字符, [^\p{name}]

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
机器学习是一种人工智能(AI)的子领域,致力于研究如何利用数据和算法让计算机系统具备学习能力,从而能够自动地完成特定任务或者改进自身性能。机器学习的核心思想是让计算机系统通过学习数据中的模式和规律来实现目标,而不需要显式地编程。 机器学习应用非常广泛,包括但不限于以下领域: 图像识别和计算机视觉: 机器学习在图像识别、目标检测、人脸识别、图像分割等方面有着广泛的应用。例如,通过深度学习技术,可以训练神经网络来识别图像中的对象、人脸或者场景,用于智能监控、自动驾驶、医学影像分析等领域。 自然语言处理: 机器学习在自然语言处理领域有着重要的应用,包括文本分类、情感分析、机器翻译、语音识别等。例如,通过深度学习模型,可以训练神经网络来理解和生成自然语言,用于智能客服、智能助手、机器翻译等场景。 推荐系统: 推荐系统利用机器学习算法分析用户的行为和偏好,为用户推荐个性化的产品或服务。例如,电商网站可以利用机器学习算法分析用户的购买历史和浏览行为,向用户推荐感兴趣的商品。 预测和预测分析: 机器学习可以用于预测未来事件的发生概率或者趋势。例如,金融领域可以利用机器学习算法进行股票价格预测、信用评分、欺诈检测等。 医疗诊断和生物信息学: 机器学习在医疗诊断、药物研发、基因组学等领域有着重要的应用。例如,可以利用机器学习算法分析医学影像数据进行疾病诊断,或者利用机器学习算法分析基因数据进行疾病风险预测。 智能交通和物联网: 机器学习可以应用于智能交通系统、智能城市管理和物联网等领域。例如,可以利用机器学习算法分析交通数据优化交通流量,或者利用机器学习算法分析传感器数据监测设备状态。 以上仅是机器学习应用的一部分,随着机器学习技术的不断发展和应用场景的不断拓展,机器学习在各个领域都有着重要的应用价值,并且正在改变我们的生活和工作方式。
出现这种情况,可能会导致攻击者上传恶意文件,例如包含恶意代码的文件,以执行任意代码或获取敏感信息。为了处理上传文件名存在导致漏洞,可以采取以下措施: 1. 进行文件类型和文件大小的验证。在上传文件之前,可以检查文件的类型和大小。例如,可以检查文件扩展名是否合法,文件类型是否符合业务需求,以及文件大小是否在合理范围内。 2. 对上传文件进行重命名。可以在上传文件文件进行重命名,避免使用原有的文件名。例如,可以使用唯一标识符作为文件名,并在数据库中维护文件名和唯一标识符之间的映射关系。 3. 对上传文件进行隔离。可以将上传文件存储在不同的目录或磁盘分区中,避免上传文件对其他文件的影响。例如,可以将上传的文件存储在一个只有应用程序有权限访问的目录中。 4. 对上传文件进行安全扫描。可以使用安全扫描工具对上传的文件进行扫描,以检测是否存在恶意代码或漏洞。如果发现问题,可以将文件标记为不安全,并提示用户重新上传。 5. 对上传文件进行权限控制。可以对上传的文件设置访问权限,以确保只有有权限的用户才能访问上传的文件。例如,可以限制只有管理员或特定用户组能够访问上传的文件。 综上所述,对于上传文件名存在导致漏洞,需要采取多种措施进行处理,以确保上传的文件安全可靠。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值