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根据文件名检索文件JAVA根据文件名检索文件JAVA根据文件名检索文件JAVA根据文件名检索文件JAVA根据文件名检索文件JAVA根据文件名检索文件JAVA根据文件名检索文件
java操作文件,得到文件名,大小,时间,及修改时间java操作文件,得到文件名,大小,时间,及修改时间java操作文件,得到文件名,大小,时间,及修改时间
java遍历文件下面的所有文件并输出文件名 java遍历文件下面的所有文件并输出文件名
java实现根据文件名查找本地文件,该程序可直接放在eclipse或者Myeclipse中则可运行,不需要下载其他什么工具包,为开发人员节省了很多时间
Java实现文件下载并解决中文文件名乱码
需要。net 2.0及以上支持。 功能: 自动截断长文件名(保留文件后缀) 可选长度 自动搜索子目录
Java生成、修改文件夹和文件名,Java创建目录或文件夹,并修改、删除、重命名文件夹或文件名称,使用进行的文件操作实例。 super("目录和文件的创建、删除和更名"); //调用父类构造函数 jtfPath=new ...
js获取file标签上传文件的文件名,可以获取文件名判断文件是否重复 以及对文件上传做控制
java实现的简单的按照文件名检索文件,输入任意字符串(比如“123”)则返回本地文件中文件名包含字符串“123”的所有文件和文件夹 及其路径,还能分盘符检索
我上传的是一个servlet,里面有详细的说明,自己看看就知道怎么做了
Java处理中文文件名-压缩中文名字的文件,演示JAVA对中文文件名的处理,有些朋友疑惑对中文文件名的操作,有时候会筹码,这个是压缩中文文件名的Java代码,或许可以参考下。
C++创建自定义文件名的文件 C++创建自定义文件名的文件 C++创建自定义文件名的文件 C++创建自定义文件名的文件 C++创建自定义文件名的文件 C++创建自定义文件名的文件 C++创建自定义文件名的文件 C++创建自定义...
Java生成一个文件打开的文件选择对话框窗口,和Win系统的浏览文件窗口相似,使用Java代码模拟实现的窗口程序,相关代码如下: button.addActionListener(new ActionListener() { //按钮事件处理 public void ...
java文件的工具类,封装了常用的操作,尤其针对文件的实际类型,通过获取文件的byte,来查看文件起始字节的魔数值,通过魔数值来判断文件的类型,工具集合了常用的文件类型对应的魔数,也封装了文件类型的判断方法
"Java中文件选择器JFileChooser.showSaveDialog实现默认文件名的解决方案" 在 Java 中,文件选择器 JFileChooser 是一个常用的组件,用于选择打开文件或保存文件。然而,在使用 JFileChooser 的时候,我们经常会...
SD卡FATFS 文件系统 STM32可读可写支持长文件名
C#Socket文件传输,将文件名和文件保存到一个byte[]中传输,再通过解析获取文件名和文件保存到本地文件夹中
java 按顺序读取文件 java 按顺序读取文件 java 按顺序读取文件