本篇文章由作者wdd撰写,属于i春秋原创奖励计划,未经许可禁止转载。本文旨在深度解析OGNL表达式漏洞原理,尤其是针对Struts2漏洞分析的领域。文章将详细讨论setValue和getValue方法的运作机制,揭示Struts2漏洞分析的最后一层奥秘。在阅读本篇后,希望能为读者提供对整个系列,包括但不限于Struts漏洞系列的深入理解。漏洞触发方式主要分为setValue和getValue两种。市面上的payload通常分为针对setValue和getValue的两种类型。本篇将详细探讨这些payload的区别,以及payload构造的原因。示例payload包括:“@java.lang.Runtime@getRuntime().exec('calc')”(双括号形式)和“aba”(非双括号形式)。首先,我们从相对基础的getValue方法开始介绍。通过示例代码展示了一个简单的应用:通过调用exec('calc')来执行命令。完整的调用链涉及从exec方法到OgnlRuntime类的多个方法调用,最后到ASTMethod类进行反射调用,触发漏洞。在解析getValue方法的实现时,可以看到关键步骤包括解析字符串表达式为OGNL对象,然后通过evaluateGetValueBody方法计算表达式的值。这个方法中,context.getTraceEvaluations()判断是否启用表达式求值的跟踪功能,并调用getValueBody方法对OGNL树进行遍历,识别和处理逻辑。在getValueBody中,通过反射调用java.lang.Runtime@getRuntime().exec()方法,触发漏洞。对于setValue方法的payload,通常需要在字符串中添加两个括号。示例代码展示了一个带有两个括号的payload,并解释了其背后的构造逻辑。关键在于setValueBody方法中,针对payload内容的处理方式不同,从而决定是否进行二次解析。双括号形式的payload能够触发二次解析过程,这也是常见payload形式的原因。其中的内容可以自由选择,没有严格的要求。文章最后总结,通过理解和掌握setValue和getValue两种触发方式,读者将能更好地应对涉及OGNL表达式漏洞的分析和修复,无论遇到何种漏洞,都能有条不紊地进行分析和应对。至此,关于OGNL表达式漏洞原理的深入解析结束。