-
Java FtpClient 实现文件上传服务
2020-08-31 20:44:54本文主要对Java FtpClient实现简单的图片上传到服务器的方法进行介绍,并且展示的小demo中,对配置过程中主要碰到的问题:关于文件权限的问题也进行了说明,下面跟着小编一起来看下吧 -
java如何设置linux服务器文件的权限
2019-05-29 21:16:17Linux下用户组、文件权限详解: ... java代码实现文件上传到linux服务器及问题汇总及解决(亲测可行) https://www.xuebuyuan.com/3243572.html 【Linux】目录文件权... -
用struts1.x实现文件上传——遇到java.io.filenotfoundexception 拒绝访问——问题的解决办法
2010-03-26 21:08:00首先分析是由于没有权限访问,因而可以推想到是自己要把文件放入的文件夹的权限不够,所以有如下解决方案: 在服务器端首先要将从客户端接受上传文件的那个目录的“只读”属性删除。例如服务器端接受上传文件的目录...首先分析是由于没有权限访问,因而可以推想到是自己要把文件放入的文件夹的权限不够,所以有如下解决方案:
在服务器端首先要将从客户端接受上传文件的那个目录的“只读”属性删除。例如服务器端接受上传文件的目录是uploadfile,则更改uploadfile的“只读”属性。
更改后,就可以顺利的将自己需要的文件上传到指定的文件夹中了:
这里面要注意:
1.文件:<input type="file" name="myfile"><br> ——这里的type一定为file属性
2.在对应的ActionForm中,文件必须采用FormFile声明,如下:
private FormFile myfile;
说明:在struts中,文件上传的FormFile其实是一个接口,里面有public String getContentType(); public void setContentType(String contentType); public int getFileSize(); public void setFileSize(int fileSize); public String getFileName(); public void setFileName(String fileName); public byte[] getFileData(); public InputStream getInputStream()这些方法常用,具体大家可以参照commons-fileupload.jar包学习具体方法的使用。 -
android上传大文件亲测可用,上传200M个文件,不到3分钟
2013-02-27 13:36:31今天测试了一下之前网上找的例子,通过Socket实现的android下大文件上传,服务器端用java接收。测试上传了个200M的文件,不到三分钟!还是可以接受的。 只是做了个简单的测试例子,还没有考虑到权限问题(手机...之前贴过个例子是android 入门学习笔记 上传大文件 这种的文件大小限制很严,一般30M以上就报错了。网上查了一下,还是推荐用Socket连接进行大文件上传。
今天测试了一下之前网上找的例子,通过Socket实现的android下大文件上传,服务器端用java接收。测试上传了个200M的文件,不到三分钟!还是可以接受的。
只是做了个简单的测试例子,还没有考虑到权限问题(手机上传资料到服务器端,应该需要做身份验证。。)
- connection.setChunkedStreamingMode(chunkSize);
使用这个代码就可以了,connection为 HttpURLConnection的实例完整代码如下:
- /* 上传文件至Server的方法 */
- private void uploadFile()
- {
- String end = "\r\n";
- String twoHyphens = "--";
- String boundary = "*****";
- try
- {
- URL url =new URL(actionUrl);
- HttpURLConnection con=(HttpURLConnection)url.openConnection();
- con.setChunkedStreamingMode(51200);
- /* 允许Input、Output,不使用Cache */
- con.setDoInput(true);
- con.setDoOutput(true);
- con.setUseCaches(false);
- /* 设置传送的method=POST */
- con.setRequestMethod("POST");
- /* setRequestProperty */
- con.setRequestProperty("Connection", "Keep-Alive");
- con.setRequestProperty("Charset", "UTF-8");
- con.setRequestProperty("Content-Type",
- "multipart/form-data;boundary="+boundary);
- /* 设置DataOutputStream */
- DataOutputStream ds =
- new DataOutputStream(con.getOutputStream());
- ds.writeBytes(twoHyphens + boundary + end);
- ds.writeBytes("Content-Disposition: form-data; " +
- "name=\"file1\";filename=\"" +
- newName +"\"" + end);
- ds.writeBytes(end);
- /* 取得文件的FileInputStream */
- FileInputStream fStream = new FileInputStream(uploadFile);
- /* 设置每次写入1024bytes */
- int bufferSize = 1024;
- byte[] buffer = new byte[bufferSize];
- int length = -1;
- /* 从文件读取数据至缓冲区 */
- while((length = fStream.read(buffer)) != -1)
- {
- /* 将资料写入DataOutputStream中 */
- ds.write(buffer, 0, length);
- }
- ds.writeBytes(end);
- ds.writeBytes(twoHyphens + boundary + twoHyphens + end);
- /* close streams */
- fStream.close();
- ds.flush();
- /* 取得Response内容 */
- InputStream is = con.getInputStream();
- int ch;
- StringBuffer b =new StringBuffer();
- while( ( ch = is.read() ) != -1 )
- {
- b.append( (char)ch );
- }
- /* 将Response显示于Dialog */
- showDialog(b.toString().trim());
- /* 关闭DataOutputStream */
- ds.close();
- }
- catch(Exception e)
- {
- showDialog(""+e);
- }
- }
应要求贴上源码下载地址:http://download.csdn.net/detail/jdsjlzx/8150031
-
java源码包---java 源码 大量 实例
2013-04-18 23:15:26Applet钢琴模拟程序java... //连接到服务器 ftpClient.login(user,pass); //在服务器上注册 InputStream is=ftpClient.list(); //得到服务器目录与文件列表输入流 StringBuffer info=new StringBuffer(); /... -
上传“定时任务“获取系统权限
2020-11-25 17:02:05但是如果在业务实现过程中没有考虑相关的安全问题(例如没有对用户上传的文件类型做校验或者校验不充分,导致用户可以上传恶意脚本到服务器)便会导致相关的风险。 Java文件类File以抽象的方式代表文件名和目录...原文来自SecIN社区—作者:tkswifty
相关背景
文件上传是系统中比较常见的业务需求,例如上传头像、简历、报表等。但是如果在业务实现过程中没有考虑相关的安全问题(例如没有对用户上传的文件类型做校验或者校验不充分,导致用户可以上传恶意脚本到服务器)便会导致相关的风险。
Java文件类File以抽象的方式代表文件名和目录路径名。该类主要用于文件和目录的创建、文件的查找和文件的删除等。
一般新建文件是通过将给定路径名字符串转换成抽象路径名来创建一个新File实例:File file = new File("path")
使用File创建文件时,若路径处path写入…/…/穿越符号,是可以跨目录新建文件的:
看一个例子,下面是通过引入…/…/穿越符进行跨目录在上级目录Desktop创建文件:
结合该特点,结合特定的利用场景可以完成相关的权限获取操作。例如:
linux写入定时任务、ssh公钥
windows写入自启动脚本、恶意dll
…
挖掘过程
一般针对文件上传业务,主要判断是否有检查后缀名,同时要查看配置文件是否有设置白名单或者黑名单,如果没有的话,那么攻击者利用该缺陷上传类似webshell等恶意文件。
目标系统主要是通过commons-fileupload组件来实现文件上传,具体实现如下:DiskFileItemFactory factory = new DiskFileItemFactory(); factory.setRepository(new File(System.getProperty("java.io.tmpdir"))); ServletFileUpload upload = new ServletFileUpload(factory); // 设置上传文件大小的上限 upload.setSizeMax(100 * 1024 * 1024); List<FileItem> items = new ArrayList<>(); // 上传解析 try { items = upload.parseRequest(request); Iterator it = items.iterator(); while (it.hasNext()) { FileItem fit = (FileItem) it.next(); String fileName = fit.getName(); String suffix = fileName.substring(fileName.lastIndexOf(".")); if(blackSuffix.contains(suffix)) { return (new OpenAPIResponse()).getFailResp("禁止上传恶意文件"); } File file = new File("/resource/upload/"+ fileName); fit.write(file); } } catch (FileUploadException fe) { fe.printStackTrace(); }
该实现方式可以简单概述为:
通过黑名单对上传的后缀进行了检查
未对上传文件进行重命名
针对后缀名检查,尝试上传jsp/jspx等恶意文件应该是没戏了,第一时间想到了%00截断。但是JDK1.7.0_40(7u40)开始对\00进行了检查,相关代码如下:final boolean isInvalid(){ if(status == null){ status=(this.path.indexOf('\u0000')<0)?PathStatus.CHECKED:PathStatus.INVALID; } return status == PathStatus.INVALID; }
所以%00截断应该是无法成功的。
查看commons-fileupload组件具体获取文件名的方法看看有没有利用的可能:
首先是解析multipart上传请求的实现:
public List parseRequest(RequestContext ctx) throws FileUploadException { List items = new ArrayList(); boolean successful = false; Iterator iterator; try { FileItemIterator iter = getItemIterator(ctx); FileItemFactory fac = getFileItemFactory(); if (fac == null) { throw new NullPointerException("No FileItemFactory has been set."); } FileItemStream item; while (iter.hasNext()) { item = iter.next(); String fileName = ((FileUploadBase.FileItemIteratorImpl.FileItemStreamImpl)item).name; FileItem fileItem = fac.createItem(item.getFieldName(), item.getContentType(), item.isFormField(), fileName); items.add(fileItem);
这里直接获取上传的文件名然后封装到FileItemStream对象里方便后续操作。查看后续获取上传文件名的方法:
public String getName() { return Streams.checkFileName(this.fileName); }
进一步查看Streams.checkFileName()的具体实现:
public static String checkFileName(String pFileName) { if ((pFileName != null) && (pFileName.indexOf(0) != -1)) { StringBuffer sb = new StringBuffer(); for (int i = 0; i < pFileName.length(); i++) { char c = pFileName.charAt(i); switch (c) { case '\000': sb.append("\\0"); break; default: sb.append(c); } } throw new InvalidFileNameException(pFileName, "Invalid file name: " + sb); } return pFileName; }
同样的也对00截断进行了处理。但是整个过程中没有对路径穿越符…/进行处理。也就是说可以尝试构造特殊的文件名,尝试进行穿越目录上传。同时并没有重命名上传的文件名,那么可以尝试讲文件名命名为
../../../../../../../../../var/spool/cron/root
,写入定时任务尝试反弹shell。
相关数据包如下,尝试写入root的定时任务,每分钟反弹shell到相关主机的8888端口:
上传成功后等待定时任务执行,比较幸运,成功反弹shell:
整个缺陷利用过程首先是黑名单的局限性,然后没有对上传的文件名进行重命名操作,结合目录穿越上传最终导致通过上传"定时任务"获取系统权限。
文件目录穿越上传的处理方式
针对上面的场景,那么如何对文件目录穿越上传进行相应的防护呢?这里参考了一下Spring的做法。
spring-web项目包含Web应用开发时,用到Spring 框架时所需的核心类,包括自动载入Web Application Context 特性的类、Struts 与JSF 集成类、文件上传的支持类、Filter 类和大量工具辅助类。
其内部实现也是通过集成commons-fileupload组件来实现文件上传解析的:
查看其获取上传文件名的方法:
相关代码:
public String getOriginalFilename() { String filename = this.fileItem.getName(); if (filename == null) { return ""; } int pos = filename.lastIndexOf("/"); if (pos == -1) { pos = filename.lastIndexOf("\\"); } if (pos != -1) { return filename.substring(pos + 1); } return filename; }
这里分别对linux、windows的情况进行了处理,只截取
/
或者\\
最终的文件名,那么类似../../../../../../../../../var/spool/cron/root
的文件名最终取得的的应该是root,这样就没法进行目录穿越上传了,从而一定程度上解决了某些场景下的安全风险。当然了,对上传的文件名随机命名,如UUID、GUID,不允许用户自定义也是一种不错的防护手段。 -
sftp下载文件过程中报错:“java.io.IOException: Pipe closed” 解决:inputStream复制
2021-01-20 16:12:40背景:实现文件SFTP上传和下载功能,公司一开始实现是直接上传到服务器,生产环境权限不足不能进行新建文件,改进为sftp上传下载,在下载的过程中出现以下报错 sftp下载文件过程中报错:“java.io.IOException: Pipe... -
java源码包2
2013-04-20 11:28:17Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰... -
java源码包3
2013-04-20 11:30:13Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰... -
shell获取目录的上级目录_上传"定时任务"获取系统权限
2021-01-04 16:51:30但是如果在业务实现过程中没有考虑相关的安全问题(例如没有对用户上传的文件类型做校验或者校验不充分,导致用户可以上传恶意脚本到服务器)便会导致相关的风险。 Java文件类File以抽象的方式代表文件名和目录路径... -
delphi7 获取dll的类_上传"定时任务"获取系统权限
2020-11-30 01:58:13但是如果在业务实现过程中没有考虑相关的安全问题(例如没有对用户上传的文件类型做校验或者校验不充分,导致用户可以上传恶意脚本到服务器)便会导致相关的风险。 Java文件类File以抽象的方式代表文件名和目录路径... -
JAVA上百实例源码以及开源项目
2016-01-03 17:37:40Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰... -
JAVA上百实例源码以及开源项目源代码
2018-12-11 17:07:42简介 笔者当初为了学习JAVA,收集了很多... //连接到服务器 ftpClient.login(user,pass); //在服务器上注册 InputStream is=ftpClient.list(); //得到服务器目录与文件列表输入流 StringBuffer info=new StringBuffer... -
Java微服务架构l零从基础到精通高清视频教程全套 163课
2019-09-26 09:52:57Java微服务架构l零从基础到精通高清视频教程全套 第1章 微服务简介 001构建单体应用 002微服务解决复杂问题 003微服务的优点 004微服务的缺点 第2章 Linux使用 005Linux 简介 006Linux 与 Windows 比较 007... -
成百上千个Java 源码DEMO 4(1-4是独立压缩包)
2017-03-29 17:40:59//连接到服务器 ftpClient.login(user,pass); //在服务器上注册 InputStream is=ftpClient.list(); //得到服务器目录与文件列表输入流 StringBuffer info=new StringBuffer(); //实例化StringBuffer对象,用于输出... -
成百上千个Java 源码DEMO 3(1-4是独立压缩包)
2017-03-29 17:39:54//连接到服务器 ftpClient.login(user,pass); //在服务器上注册 InputStream is=ftpClient.list(); //得到服务器目录与文件列表输入流 StringBuffer info=new StringBuffer(); //实例化StringBuffer对象,用于输出... -
基于Spring Boot实现图片上传/加水印一把梭操作 EVCache缓存在 Spring Boot中的实战 Guava Cache本地缓存在 Spring Boot应用中的实践 Spring Boot项目利用MyBatis Generator进行数据层代码自动生成 初探Kotlin+...
-
Java开源的下一代社区平台Symphony.zip
2019-07-19 04:36:022009 年选择了 GAE 作为服务器,并开始实现 Latke 框架来解决跨云平台,直到告别 GAE,不得不感叹技术更迭之快 感受到了自造轮子的优缺点,并且可以肯定一点:对于一个想要长久的产品来说,自制技术框架优势远大于... -
《Java Web开发实战1200例(第I卷)》(清华出版.卢瀚.王春斌).part2 高清完整PDF版
2016-06-13 12:06:47实例280 上传文件到服务器 实例281 限制文件大小的文件上传 11.3 通过组件实现文件上传 实例282 使用jspSmartUpload组件实现文件上传 实例283 使用jspSmartUpload组件实现中文名文件上传 实例284 应用jsp... -
Java开发实战1200例.第2卷.part3
2013-05-08 22:46:34实例165 乱码问题 265 实例166 显示数值 267 实例167 抗锯齿设置 268 7.2 设置图表的背景 270 实例168 设置背景图 270 实例169 设置背景图片透明度 271 实例170 设置背景色 273 7.3 处理图表的边框 274 实例171 隐藏... -
Java开发实战1200例.第2卷.part2
2013-05-08 22:45:35实例165 乱码问题 265 实例166 显示数值 267 实例167 抗锯齿设置 268 7.2 设置图表的背景 270 实例168 设置背景图 270 实例169 设置背景图片透明度 271 实例170 设置背景色 273 7.3 处理图表的边框 274 实例171 隐藏... -
Java开发实战1200例.第2卷.part1
2013-05-08 22:44:13实例165 乱码问题 265 实例166 显示数值 267 实例167 抗锯齿设置 268 7.2 设置图表的背景 270 实例168 设置背景图 270 实例169 设置背景图片透明度 271 实例170 设置背景色 273 7.3 处理图表的边框 274 实例171 隐藏... -
Java Web开发实战1200例(第2卷)(完整版).(清华出版.卢瀚.王春斌).part1
2016-06-13 20:03:04书名:《Java Web开发实战1200例(第II卷)》(清华大学出版社.卢瀚.王春斌) PDF格式扫描版,全书分为7篇23章,共960页。2011年6月出版。 注:原书只有前20章818页,本人添加了剩余章节重新编辑成完整版本,为了方便... -
Java实现单向链表 栈和队列就是这么简单 十道简单算法题 十道算法题【二】 :art:Linux 工作中常用到的Linux命令 看完这篇Linux基本的操作就会了 用户和权限管理看了你就会用啦 Linux进程管理 Linux网络管理 :...
-
-
-
jquery.form.js表单上传文件 vue.js axios element组件 vxe-table表格在线编辑 LICENSE EngineerCMS source code is licensed under the Apache Licence, Version 2.0 ...
-
JspRun!社区论坛系统 v6.0 bulid 090423 GBK 源码版.rar
2019-07-06 06:21:47的基础架构采用世界上最先进流行的 web 编程组合 JAVA MySQL 实现,是一个经过完善设计,适用于各种服务器环境的高效论坛系统解决方案。系统采用struts、hibernate框架及中间件的结合既实现了业务逻辑与控制逻辑的...