
影响范围
版本 < 6.13.23
6.14.0 ≤ 版本 < 7.4.11
7.5.0 ≤ 版本 < 7.11.6
7.12.0 ≤ 版本 < 7.12.5
原因与利用方式
Confluence 使用框架将 URL 映射到 Java 类,从而创建所谓的“action”。Action URL 以“.action”结尾,并在 confluence-.jar 的 xwork.xml 文件以及附带插件的 JAR 文件中的 atlassian-plugin.xml 文件中定义。每个 action 至少包含一个 name 属性(定义 action 名称)、一个 class 属性(定义执行 action 的 Java 类)以及至少一个 result 元素(根据 action 的结果决定要渲染的 Velocity 模板)。从 action 返回的常见值有“error”、“input”、“success”,但如果与 XWork XML 中的 result 元素匹配,也可以使用任何结果。Action 可以包含 method 属性,允许调用指定 Java 类的特定方法。如果未指定方法,则调用 doDefault() 方法。以下是 createpage-entervariables action 的 action 条目:

com.atlassian.confluence.pages.actions.PageVariablesAction 类中的 doEnter() 方法处理对 doenterpagevariables.action 的请求,并返回“error”、“input”、“success”值。这会导致渲染对应的 Velocity 模板。
这里,action 元素的“name”属性值对应于路径 /.action,并且元素包含的模板将作为响应的一部分显示(基于 error/success 等)。因此,根据此示例,只需访问 /pages/doenterpagevariables.action 即可渲染 velocity 模板。

我们可以观察到 velocity 模板在 HTML 页面中是如何渲染的。

在模板中将标签名称作为参数输入,并注意到这些值是从请求参数中获取并返回在响应中的。

#tag 的使用方式: #tag (“attribute1”, “attribute2”, “attribute3”)
这些属性在渲染过程中会通过 AbstractTagDirective.applyAttributes() 获取。

#tag ("Hidden" "name='queryString'" "value='ahihihi'")
在属性由 AbstractTagDirective.applyAttributes() 方法获取后,它们被传递给 AbstractUITag.doEndTag() → AbstractUITag.evaluateParams()。

然后继续传递给 WebWorkTagSupport.findValue() → OgnlValueFinder.findValue(),并以表达式形式传入。

随后传递给 SafeExpressionUtil.isSafeExpression()。

在这里,表达式已被编译,经过黑名单检查并放入缓存。编译步骤会将表达式编译为 ASTConst 形式,当被评估时,会返回之前编译好的字符串。

当表达式从输入中添加了“'”时,它已被转义为 HTML 实体。

转义发生在 HtmlAnnotationEscaper.annotatedValueInsert()。

在这里,调用了 ognl.JavaCharStream.readChar() 方法并评估 Unicode 转义字符,因此当传入“\u0027”时,它会被转换为“'”。因此可以转义并附加 OGNL 表达式。

但必须绕过 OGNL 的黑名单,如下所示:

可以通过使用数组访问器(Array accessors)而不是使用“getClass”方法或“.class”属性来绕过。
queryString=aaa\u0027%2b#{\u0022\u0022[\u0022class\u0022]}%2b\u0027bbb

检测方法
监视所有 HTTP 流量请求,其中请求 URI 的路径部分包含下表中“URI Path”列中的任一字符串:
如果发现此类请求,则应检查 HTTP 请求方法。如果请求方法是 POST,则在 HTTP 请求的 body 中查找上表中对应的 Vulnerable Parameters;如果请求方法是 GET,则在 HTTP 请求的 request-URI 中查找这些参数。检查任意 Vulnerable Parameters 的值是否包含字符串“\u0027”或其 URL 编码形式。如果是,则该流量应被视为恶意流量,可能正在发生针对此漏洞的利用攻击。
| URI Path | Vulnerable Parameters |
|---|
| /users/darkfeatures.action | featureKey |
| /users/enabledarkfeature.action | featureKey |
| /users/disabledarkfeature.action | featureKey |
| /login.action | token |
| /dologin.action | token |
| /signup.action | token |
| /dosignup.action | token |
| /pages/createpage-entervariables.action | queryString, linkCreation |
| /pages/doenterpagevariables.action | queryString |
| /pages/createpage.action | queryString |
| /pages/createpage-choosetemplate.action | queryString |
| /pages/docreatepagefromtemplate.action | queryString |
| /pages/docreatepage.action | queryString |
| /pages/createblogpost.action | queryString |
| /pages/docreateblogpost.action | queryString |
| /pages/copypage.action | queryString |
| /pages/docopypage.action | queryString |
| /plugins/editor-loader/editor.action | syncRev |