当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2012-011779

漏洞标题:百度Ueditor开源编辑器Java版本jsp文件上传漏洞

相关厂商:百度

漏洞作者: shack2

提交时间:2012-09-05 12:39

修复时间:2012-10-20 12:39

公开时间:2012-10-20 12:39

漏洞类型:文件上传导致任意代码执行

危害等级:中

自评Rank:6

漏洞状态:厂商已经确认

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2012-09-05: 细节已通知厂商并且等待厂商处理中
2012-09-05: 厂商已经确认,细节仅向厂商公开
2012-09-08: 细节向第三方安全合作伙伴开放
2012-10-30: 细节向核心白帽子及相关领域专家公开
2012-11-09: 细节向普通白帽子公开
2012-11-19: 细节向实习白帽子公开
2012-10-20: 细节向公众公开

简要描述:

系统默认的文件上传处理jsp过滤不严导致可以上传jsp文件,jsp你懂得系统权限,可以执行任意命令....

详细说明:


问题出在imageUp.jsp
这里使用java正则表达式验证上传文件的文件名,重新设置文件名的时候,没有使用lastIndexOf()方法来找最后一个点,导致可以上传xx.jpg.jsp,xx.png.jsp
等类型文件,强烈建议官方修改这个,虽然官方声明此上传jsp做示例,但很多程序员,站长,基本没有修改就使用了。

漏洞证明:

修复方案:

版权声明:转载请注明来源 shack2@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:10

确认时间:2012-09-05 16:12

厂商回复:

感谢你对百度安全的关注,我们马上处理!

最新状态:

暂无


漏洞评价:

评论

  1. 2012-09-05 12:43 | 风萧萧 认证白帽子 ( 核心白帽子 | Rank:1020 漏洞数:76 | 人这一辈子总要动真格的爱上什么人)

    .

  2. 2012-09-05 13:25 | 随风.潜入夜 ( 路人 | Rank:22 漏洞数:5 )

    shack2 ...当时我也准备选百度这编辑器的。后来还是没用。

  3. 2012-09-05 13:38 | lanz ( 路人 | Rank:26 漏洞数:5 | whatever)

    lz还是测试一下吧,图上的代码是没法上传jsp的

  4. 2012-09-05 13:42 | 风萧萧 认证白帽子 ( 核心白帽子 | Rank:1020 漏洞数:76 | 人这一辈子总要动真格的爱上什么人)

    @lanz 又见管理?

  5. 2012-09-05 15:19 | 随风.潜入夜 ( 路人 | Rank:22 漏洞数:5 )

    @lanz 经测试,不存在问题。还测试了下1.2.3.0的远程文件下载,绕过了第二次后缀验证,不过有响应头验证。坑爹的是就算成功下载了jsp,生成的后缀为空。

  6. 2012-09-05 15:20 | 随风.潜入夜 ( 路人 | Rank:22 漏洞数:5 )

    {'url':'upload/1346829316967','tip':'远程图片抓取成功!','srcUrl':'http://lnth1wntwss27h3:8080/baidu/jsp/1.jsp'}

  7. 2012-09-05 15:33 | 随风.潜入夜 ( 路人 | Rank:22 漏洞数:5 )

    图上花圈的String upex=fileName.substring(fileName.lastIndexOf(".")+1);得到的是jpg他取后缀是用的Iterator type = Arrays.asList(allowFiles).iterator(); 不知道你测试的那个版本,不过Pattern.compile("[.]jpg|png|jpeg|gif$");这个正则的确有问题。

  8. 2012-09-05 15:50 | shack2 ( 普通白帽子 | Rank:470 漏洞数:71 | QQ:1341413415 一个热爱编程(Java),热爱网...)

    @随风.潜入夜 对,得到的是jpg,上面设置的文件白名单没有点

  9. 2012-09-05 15:52 | shack2 ( 普通白帽子 | Rank:470 漏洞数:71 | QQ:1341413415 一个热爱编程(Java),热爱网...)

    官方1.2.2的版本imageUp.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.io.*"%> <%@ page import="org.apache.commons.fileupload.*" %> <%@ page import="org.apache.commons.fileupload.util.*" %> <%@ page import="org.apache.commons.fileupload.servlet.*" %> <%@ page import="org.apache.commons.fileupload.FileItemIterator" %> <%@ page import="org.apache.commons.fileupload.disk.DiskFileItemFactory" %> <%@ page import="java.io.BufferedInputStream" %> <%@ page import="java.io.BufferedOutputStream" %> <%@ page import="java.io.File"%> <%@ page import="java.io.InputStream" %> <%@ page import="java.io.OutputStream" %> <%@ page import="java.io.FileOutputStream" %> <%@ page import="java.util.regex.Matcher" %> <%@ page import="java.util.regex.Pattern" %> <%@ page import="java.util.Date" %> <% //仅做示例用,请自行修改 //保存文件路径 String filePath = "jsp/upload"; String realPath = request.getRealPath("\\") + filePath; //判断路径是否存在,不存在则创建 File dir = new File(realPath); if(!dir.isDirectory()) dir.mkdir(); if(ServletFileUpload.isMultipartContent(request)){ DiskFileItemFactory dff = new DiskFileItemFactory(); dff.setRepository(dir); dff.setSizeThreshold(1024000); ServletFileUpload sfu = new ServletFileUpload(dff); FileItemIterator fii = sfu.getItemIterator(request); String title = ""; //图片标题 String url = ""; //图片地址 String fileName = ""; String originalName = ""; String state="SUCCESS"; String ftype = ""; try{ while(fii.hasNext()){ FileItemStream fis = fii.next(); if(!fis.isFormField() && fis.getName().length()>0){ fileName = fis.getName(); Pattern reg=Pattern.compile("[.]jpg|png|jpeg|gif$"); Matcher matcher=reg.matcher(fileName); if(!matcher.find()) { state = "文件类型不允许!"; break; } ftype = matcher.group(); fileName = new Date().getTime()+ftype; url = realPath+"/"+fileName; BufferedInputStream in = new BufferedInputStream(fis.openStream());//获得文件输入流 FileOutputStream a = new FileOutputStream(new File(url)); BufferedOutputStream output = new BufferedOutputStream(a); Streams.copy(in, output, true);//开始把文件写到你指定的上传文件夹 }else{ String fname = fis.getFieldName(); if(fname.indexOf("fileName")!=-1){ BufferedInputStream in = new BufferedInputStream(fis.openStream()); byte c [] = new byte[10]; int n = 0; while((n=in.read(c))!=-1){ originalName = new String(c,0,n); break; } in.close(); } if(fname.indexOf("pictitle")!=-1){ BufferedInputStream in = new BufferedInputStream(fis.openStream()); byte c [] = new byte[10]; int n = 0; while((n=in.read(c))!=-1){ title = new String(c,0,n); break; } in.close(); } } } }catch(Exception e){ e.printStackTrace(); } title = title.replace("&", "&amp;").replace("'", "&qpos;").replace("\"", "&quot;").replace("<", "&lt;").replace(">", "&gt;"); response.getWriter().print("{'original':'"+originalName+"','url':'"+filePath.substring(filePath.lastIndexOf("/")+1,filePath.length())+"/"+fileName+"','title':'"+title+"','state':'"+state+"'}"); } %>

  10. 2012-09-05 15:55 | shack2 ( 普通白帽子 | Rank:470 漏洞数:71 | QQ:1341413415 一个热爱编程(Java),热爱网...)

    其实客服端验证不严可以,但服务端文件验证不严格只要文件后缀采用lastIndexOf()方法来找到最后一个一个点,就没问题了

  11. 2012-09-05 16:11 | 随风.潜入夜 ( 路人 | Rank:22 漏洞数:5 )

    @shack2 我测试的是1.2.3.0,没有发现这个问题。

  12. 2012-09-05 16:27 | wefgod ( 普通白帽子 | Rank:1807 漏洞数:179 | 力不从心)

    讨论很激烈啊

  13. 2012-09-05 16:45 | shack2 ( 普通白帽子 | Rank:470 漏洞数:71 | QQ:1341413415 一个热爱编程(Java),热爱网...)

    @随风.潜入夜 1.2.3加入了国际化,上传逻辑也封装成包了,没测试,我测的是1.2.2 java版

  14. 2012-09-05 20:31 | 随风.潜入夜 ( 路人 | Rank:22 漏洞数:5 )

    @shack2 我测试的时候直接把jar包反编译了。里面也就一个类而已。上面发的就是JAR包里面的代码。

  15. 2012-09-05 21:26 | 一刀终情 ( 普通白帽子 | Rank:156 漏洞数:28 | ‮‮PKAV技术宅社区-安全爱好者)

    看到洞主播客的时候,我还在想,这是wooyun哪个基友,wooyun好帖子全转了;结果在这呢~

  16. 2012-09-06 09:40 | shack2 ( 普通白帽子 | Rank:470 漏洞数:71 | QQ:1341413415 一个热爱编程(Java),热爱网...)

    嘿嘿

  17. 2012-11-04 20:26 | hqdvista ( 普通白帽子 | Rank:154 漏洞数:31 | N/A)

    这个应该是正则里$的位置坑爹导致的吧。。。