AdobeExperienceManager(AEM)Dispatcher绕过完全指南($10,000+赏金)

admin 2026-05-12 05:49:36 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 安全研究员MuhammadWaseem发现AdobeExperienceManagerDispatcher存在多个绕过漏洞,包括利用Apache的nocanon配置实现路径遍历和分号解析差异绕过过滤器。通过/graphql/execute.json/…%2f…/bin/querybuilder.json等载荷可未授权访问敏感端点,成功在Bugcrowd和HackerOne获得超万美元赏金。文档详细展示了从侦察到实战利用的全过程。 综合评分: 85 文章分类: 漏洞分析,WEB安全,渗透测试,红队,安全工具


cover_image

Adobe Experience Manager (AEM) Dispatcher 绕过完全指南 ($10,000+ 赏金)

muhammadwaseem29 muhammadwaseem29

赛博知识驿站

2026年5月11日 10:00 中国香港

在小说阅读器读本章

去阅读

在企业级 Web 架构的隐秘角落,总有一些容易被忽视的致命盲区。安全研究员 Muhammad Waseem 近日凭借对 Adobe Experience Manager (AEM) Dispatcher 绕过技术的深度挖掘,揽获了超万美元的丰厚赏金。这不只是运气的眷顾,更是对底层逻辑抽丝剥茧的必然结果。

让我们一探究竟。

01 研究的火花

一切的起因,源于 Twitter 上一条看似寻常的推文。安全大牛 Shubham Shah (infosec_au) 演示了如何绕过 Adobe AEM Dispatcher,这条动态犹如一颗石子,激起了千层浪。

https://x.com/infosec_au/status/1977916711295709253

Twitter研究推文

推文附带的 SLCyber 研究中心链接,更是提供了关于 AEM 漏洞的硬核技术洞察:

Finding Critical Bugs in Adobe Experience Manager

SLCyber研究文章

02 剖析基石

“Adobe Experience Manager 是当下最流行的内容管理系统之一。鉴于它在企业界的广泛应用,你几乎每天都在与基于 AEM 的站点打交道。”

读完这番话,Waseem 开始将这些关键洞察与现代漏洞狩猎的实战逻辑相融合。

03 AEM 端点的核心命门

AEM 的核心暴露了大量端点,这些端口往往会泄露站点的结构信息。其中最著名的诸如 /bin/querybuilder.json,它允许查询应用内所有的“节点”(页面内容)。

显然,作为一个运行 AEM 的站点,绝不愿意将这些仅供内部作者使用的功能毫无防备地暴露给公众。事实也的确如此,在一个配置得当的 AEM 站点上直接访问 /bin/querybuilder.json,必然会被拦截。

AEM查询构建器端点

04 标准 Dispatcher 配置

审视标准的云 AEM Dispatcher 配置,其策略堪称“铁桶阵”:默认拒绝一切请求,仅对客户需要的内容放行。

dispatcher.conf

# deny everything and allow specific entries
/0001 { /type "deny"  /url "*" }

# This rule allows content to be access
/0010 { /type "allow" /extension '(css|eot|gif|ico|jpeg|jpg|js|gif|pdf|png|svg|swf|ttf|woff|woff2|html|mp4|mov|m4v)' /path "/content/*" }

# Enable specific mime types in non-public content directories
/0011 { /type "allow" /method "GET" /extension '(css|eot|gif|ico|jpeg|jpg|js|gif|png|svg|swf|ttf|woff|woff2)' }

# Enable clientlibs proxy servlet
/0012 { /type "allow" /method "GET" /url "/etc.clientlibs/*" }

05 Dispatcher 绕过 #1:Apache vs Jetty

Adobe 提供了两种实现 Dispatcher 的方式:通过 Apache 配置和模块(disp_apache2.so),或是通过 IIS 模块。鉴于 Apache 的普及度,研究自然聚焦于此。

然而,就在默认的 Apache 配置中,研究者发现了破绽:某些路径通过 ProxyPassMatch 直接将请求转发给 AEM 主机,完全绕过了 Dispatcher 的规则集。

httpd.conf

# Prevent rewrites and filtering of Delivery API URLs
<LocationMatch&nbsp;"^/adobe/dynamicmedia/deliver/.*">
&nbsp; &nbsp; ProxyPassMatch&nbsp;http://${AEM_HOST}:${AEM_PORT}
&nbsp; &nbsp; RewriteEngine&nbsp;Off
</LocationMatch>

# SITES-11040 Do ProxyPassMatch, if caching for GraphQL is not enabled
<LocationMatch&nbsp;"/graphql/execute.json/.*">
&nbsp; &nbsp; ProxyPassMatch&nbsp;http://${AEM_HOST}:${AEM_PORT}&nbsp;nocanon
</LocationMatch>

本能的直觉让人想到路径遍历的惯用伎俩。AEM 主机常运行在 Jetty 之上,而在历史版本中,..;/ 曾是路径遍历的利器。

/adobe/dynamicmedia/deliver/..;/..;/..;/bin/querybuilder.json

现实是残酷的——现代 Jetty 早已修补了这一弱点,阻断了 ..;/ 序列。此路不通。

06 nocanon 的威力

审视下一个 LocationMatch 则有趣得多。与前者不同,这条规则使用了 nocanon 关键字。

什么是 nocanon

“通常情况下,mod_proxy 会对代理的 URL 进行规范化处理。但这可能与某些后端产生摩擦,尤其是那些使用 PATH_INFO 的后端。可选的 nocanon 关键字抑制了这一行为,将原始的、未规范化的 URL 路径直接传递给后端。”

07 执行 nocanon 绕过

Apache 通常会在检查匹配前对 URL 进行规范化。但有了 nocanon,代理直接将未经处理的原始 URL 放行。尝试如下载荷:

/graphql/execute.json/..%2f../bin/querybuilder.json

竟然成功了! Apache 因为原始 URL 包含正则 /graphql/execute.json/.* 而放行;而在后端,Jetty 却将其规范化为 /bin/querybuilder.json 再传递给 AEM。一记漂亮的暗度陈仓!

nocanon绕过逻辑

08 Apache Sling – URL 分解

为了寻找更多绕过手法,必须深入 AEM 依赖的底层框架 Apache Sling。Sling 将 URL 拆解为五个组件:资源路径选择器扩展名路径参数 和 后缀

Sling URL结构

09 解析差异

攻防博弈的精髓,在于寻找解析差异。试看如下 URL:/bin/querybuilder.tiny.json;x='hello'/extra

  • • 资源路径: /bin/querybuilder
  • • 选择器: tiny
  • • 扩展名: json
  • • 路径参数: ;x=’hello’
  • • 后缀: /extra

Dispatcher 实现了独立的解析器。如果 Dispatcher 与 Sling 对 URL 的解析存在差异,绕过便如探囊取物。

10 Dispatcher 绕过 #2:分号的秘密

通过 Ghidra 逆向分析 Dispatcher 的 decompose_url 函数,Waseem 发现了一个令人惊叹的盲点:它压根不处理路径参数! 在 Dispatcher 眼里,分号 ; 只是个普通字符。

Ghidra: decompose_url 分析

void&nbsp;decompose_url(char&nbsp;*uri,char&nbsp;**path,char&nbsp;**selectors,char&nbsp;**extension,char&nbsp;**suffix)&nbsp;{
&nbsp; // ...
&nbsp; if&nbsp;(pcVar2 != (char&nbsp;*)0x0) {
&nbsp; &nbsp; *pcVar2 =&nbsp;'';
&nbsp; &nbsp; *suffix = strdup(pcVar2);
&nbsp; }
}

利用这个盲点藏匿恶意载荷,易如反掌。例如:

/bin/querybuilder.json;x=’a/b.css/c’

Dispatcher 看到白名单中的 .css 扩展名便大开绿灯,而 Sling 却将其解析为对 /bin/querybuilder 的带参调用。这套瞒天过海的戏法,堪称惊艳。

11 Dispatcher 绕过 2.5:混合双打

Apache 的 LocationMatch 正则常常是未锚定的(缺少 ^ 和 $),这意味着匹配可以发生在字符串的任何位置。

/bin/querybuilder.json;x=’x/graphql/execute.json/x’

这种混合绕过,在 WAF 严防死守 ..%2f.. 的场景下,往往能奇效制胜。

走向实战利用

18 侦察探测

Waseem 借助 Wappalyzer 浏览器扩展,敏锐地识别出哪些企业正在使用 Adobe Experience Manager。

Wappalyzer检测

19 锁定目标

在 Bugcrowd 上狩猎时,他注意到一个运行 AEM 的高价值目标,随即展开探索。

目标识别

21 初始试探

他发送了初始请求,直接探测查询构建器端点。

Burp Suite 请求

GET&nbsp;/graphql/execute.json/bin/querybuilder.json&nbsp;HTTP/2
Host:&nbsp;target.com
User-Agent:&nbsp;Mozilla/5.0 ...

返回结果:HTTP/2 404 Not Found。初次尝试碰了壁。

404响应

22 成功突破

随后,他换上 nocanon 绕过利器,附加编码遍历:

绕过请求

GET&nbsp;/graphql/execute.json/..%2f../bin/querybuilder.json&nbsp;HTTP/2

返回结果:

{"success":true,"results":0,"total":0,"more":false,"offset":0,"hits":[]}

这是一个极具价值的正向信号,防线轰然崩塌。

200 OK响应

23 路径发现

他迅速挖掘出 AEM 的十大敏感路径,锁定了关键端点:

  • • crx/packmgr/service.jsp
  • • apps.2.json
  • • crx/packmgr/service.jsp?cmd=ls&limit=10000

24 绕过包管理器

他尝试访问包管理器。直接访问被拦截,但绕过手法让其无所遁形:

/graphql/execute.json/..%2F../crx/packmgr/service.jsp

结果: 放行!他成功窥见了系统命令的运作方式。

未授权的包管理器访问

26 列出包与影响评估

他执行 ls 命令,列出了系统上的所有包:

/graphql/execute.json/..%2f../crx/packmgr/service.jsp?cmd=ls&limit=10000

该漏洞暴露了系统的潜在弱点,可能导致严重的安全风险。这一结果足以向赏金项目证明其致命影响。

包列表影响

提交与赏金

Waseem 将这些发现在 Bugcrowd 和 HackerOne 的多个项目中提交。

Bugcrowd 提交与支付

Bugcrowd提交

Bugcrowd支付

HackerOne 报告(相同结果)

HackerOne证据1

HackerOne证据2

HackerOne证据3

这就是全部!这些正是 Waseem 对 AEM 安全的深度洞察。

希望这篇文章能为你带来启发。

原文:https://www.muhammadwaseem29.tech/blog/aem


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:赛博知识驿站 muhammadwaseem29 muhammadwaseem29《Adobe Experience Manager (AEM) Dispatcher 绕过完全指南 ($10,000+ 赏金)》

评论:0   参与:  0