turbomail文件读取漏洞

admin 2015年6月4日09:01:19评论506 views字数 240阅读0分48秒阅读模式
摘要

2014-08-31: 细节已通知厂商并且等待厂商处理中
1970-01-01: 厂商主动忽略漏洞,细节向第三方安全合作伙伴开放(绿盟科技、唐朝安全巡航、无声信息)
1970-02-25: 细节向核心白帽子及相关领域专家公开
1970-03-07: 细节向普通白帽子公开
1970-03-17: 细节向实习白帽子公开
2014-09-05: 细节向公众公开

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

缺陷编号: WooYun-2014-74431

漏洞标题: turbomail文件读取漏洞 turbomail文件读取漏洞

相关厂商: turbomail.org

漏洞作者: applychenturbomail文件读取漏洞

提交时间: 2014-08-31 00:07

公开时间: 2014-09-05 00:08

漏洞类型: 任意文件遍历/下载

危害等级: 高

自评Rank: 20

漏洞状态: 漏洞已经通知厂商但是厂商忽略漏洞

漏洞来源:www.wooyun.org ,如有疑问或需要帮助请联系

Tags标签: 任意文件读取利用 文件操作参数未加过滤

3人收藏


漏洞详情

披露状态:

2014-08-31: 细节已通知厂商并且等待厂商处理中
1970-01-01: 厂商主动忽略漏洞,细节向第三方安全合作伙伴开放(绿盟科技唐朝安全巡航无声信息
1970-02-25: 细节向核心白帽子及相关领域专家公开
1970-03-07: 细节向普通白帽子公开
1970-03-17: 细节向实习白帽子公开
2014-09-05: 细节向公众公开

简要描述:

登录情况下有效。

详细说明:

Web.xml中有个j2me的servlet

turbomail文件读取漏洞

打开反编译出来的J2MEServlet.java,有以下的代码:

code 区域
else if (ACTION_TYPE.equals("ACTION_VIEW_EMAIL_ATTACHS")) {
/* 348 */ String sessionId = dataInputStream.readUTF();
/* 349 */ if (sessionId == null) {
/* 350 */ return;
/* */ }
/* */
/* 353 */ String mbtype = dataInputStream.readUTF();
/* 354 */ String msgid = dataInputStream.readUTF();
/* 355 */ String realFileName = dataInputStream.readUTF();
/* 356 */ String fileName = dataInputStream.readUTF();
/* 357 */ dataOutputStream.writeUTF(MailAdmin.getAttachContent(sessionId,
/* 358 */ mbtype, msgid, realFileName, fileName));
/* */ }
/* */ }
/* */ catch (Exception e) {
/* 362 */ e.printStackTrace();
/* */ }
/* */
/* 367 */ byte[] bs1 = byte_stream.toByteArray();
/* */
/* 369 */ byte[] bs = ZipU**.**.**.**press(bs1);
/* 370 */ response.setContentLength(bs.length);
/* 371 */ response.getOutputStream().write(bs);
/* */
/* 374 */ response.getOutputStream().flush();
/* */ }

程序使用readUTF()获取数据,然后在357那里调用了MailAdmin.getAttachContent()方法,在MailAdmin.java文件中找到此方法定义:

code 区域
/*      */   public static String getAttachContent(String sessionid, String mbtype, String msgid, String realFileName, String fileName)
/* */ throws UnsupportedEncodingException
/* */ {
/* 421 */ MailSession ms = MailMain.s_sessionadmin.getSession(sessionid);
/* 422 */ UserInfo userinfo = ms.userinfo;
/* 423 */ msgid =
/* 424 */ Util.formatRequest(msgid, MailMain.s_os, SysConts.New_InCharSet);
/* 425 */ String prefix = ms.temp_path;
/* 426 */ String path = prefix + SysConts.FILE_SEPARATOR + userinfo.getUid() +
/* 427 */ "@" + userinfo.domain;
/* 428 */ path = path + SysConts.FILE_SEPARATOR +
/* 429 */ Util.GBToISO(mbtype, ms.encoding, MailMain.s_os);
/* 430 */ path = path + SysConts.FILE_SEPARATOR + msgid;
/* */
/* 432 */ String realfile = path + SysConts.FILE_SEPARATOR + realFileName;
/* 433 */ String strContent = "";
/* */
/* 435 */ if (fileName.endsWith(".txt")) {
/* 436 */ FileInputStream fis = null;
/* 437 */ byte[] bs = null;
/* */ try
/* */ {
/* 440 */ File f = new File(realfile);
/* 441 */ if (f.exists()) {
/* 442 */ int iLen = (int)f.length();
/* 443 */ bs = new byte[iLen];
/* 444 */ fis = new FileInputStream(realfile);
/* 445 */ fis.read(bs);
/* 446 */ fis.close();
/* */ }
/* */ } catch (Exception localException) {
/* */ }
/* */ try {
/* 451 */ if (fis != null)
/* 452 */ fis.close();
/* */ }
/* */ catch (Exception localException1) {
/* */ }
/* 456 */ if (bs != null)
/* 457 */ strContent = new String(bs, ServerConf.s_Default_Encoding);
/* 458 */ } else if (fileName.endsWith(".pdf")) {
/* 459 */ strContent = PDFUtil.getTextFromPDF(realfile);
/* 460 */ } else if (fileName.endsWith(".doc")) {
/* 461 */ strContent = POIUtil.getTextFromWord(realfile);
/* 462 */ } else if (fileName.endsWith(".ppt")) {
/* 463 */ strContent = POIUtil.getTextFromPowerPoint(realfile);
/* 464 */ } else if (fileName.endsWith(".xls")) {
/* 465 */ strContent = POIUtil.getTextFromExcel(realfile);
/* */ }
/* 467 */ strContent = Util.replace(strContent, "/r", "");
/* 468 */ return strContent;
/* */ }

最终的读取的文件路径realfile由以下的数据组成:

code 区域
String realfile = path + SysConts.FILE_SEPARATOR + realFileName;

控制realFileName参数的值即可浏览文件,下面用writeUTF构造POST数据(注意需要登录之后的sessionid):

turbomail文件读取漏洞

读取回来的数据在程序中使用ZipU**.**.**.**press()加密,大概是这个样子:

turbomail文件读取漏洞

其还有一个解密方法ZipUtil.decompress(),调用它解密数据:

turbomail文件读取漏洞

turbomail默认情况下是将密码(base64encode)以文件的形式存放在服务器上,此漏洞影响还是比较大的。

漏洞证明:

同上

修复方案:

混淆代码过滤数据你懂的

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


漏洞回应

厂商回应:

危害等级:无影响厂商忽略

忽略时间:2014-09-05 00:08

厂商回复:

最新状态:

2014-09-11:谢谢查出此漏洞,此漏洞需要系统帐号登录后才可以使用,危害一般,新版本会修复此漏洞


漏洞评价:

对本漏洞信息进行评价,以更好的反馈信息的价值,包括信息客观性,内容是否完整以及是否具备学习价值

漏洞评价(共0人评价):

登陆后才能进行评分


评价

  1. 2014-09-04 16:50 | applychen turbomail文件读取漏洞 ( 普通白帽子 | Rank:667 漏洞数:57 | 万古漫漫长如夜)

    0

    厂商你怎么了不要忽略啊……

  2. 2014-09-12 00:38 | applychen turbomail文件读取漏洞 ( 普通白帽子 | Rank:667 漏洞数:57 | 万古漫漫长如夜)

    0

    普通权限账号登录后一样可以利用,请复核一下吧

  3. 2014-12-29 15:14 | Wens0n ( 普通白帽子 | Rank:102 漏洞数:23 | 精华漏洞数:32 | WooYun认证√ 舞蹈系教授)

    1

    @applychen 厂家一般都是忽略葫芦娃兄弟的

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin