struts2漏洞中关于动态方法调用的一点思考

struts2框架是一个比较容易出问题的框架,我第一次正儿八经接触这块的漏洞是在陶大师给我了一个下文中场景2的站点开始,当时一点也不懂,自己搭了一个站点调试和学习了下,现在把自己掌握的一小块知识跟大家分享下。

其中包括了在s2-032,s2-045,s2-046测试中容易疏忽的一种利用场景。

struts2动态调用的时候

分为三种

1.指定method调用方式

这种情况下不需要开启DMI,属于直接在配置文件struts.xml.中配置对应action的method

如下测试

2:感叹号!调用(DMI开启)

对比前面的一种一个method写一个的方法,当方法比较多的时候,struts文件会大爆炸

采用DMI调用,可以通过action!method.action的方式来调用,我们前面说的比较容易出问题的地方也在这里

此时在网站的页面里面,链接的url格式也是这样,例如:

所以无论是人工测试还是扫描器爬虫,我们都无法直接抽取出真正的action入口页面。

在struts2 032测试中,也包括其他的struts漏洞,扫描器还有其他渗透工具习惯于去直接在action页面直接后缀poc

来进行对应struts2漏洞的验证,但是针对上述的这种调用方式,这样来验证的方式是无效的。

请看下面的测试结果:

这样情况下,系统会执行正常的功能流程,而不会触发代码执行,但是这个站点真的不能利用了吗?可以

下面我通过调试具体的流程来看下为什么会出现这样的情况:

当我们直接在执行类似student!add.action?method:payload,时候

在最初的mapper过滤器里面,我们可以看到我们构造的利用代码确实被分割成了method,放入mapping中

但是这个漏洞真正要被触发是在invocation里面,是要通过proxy去执行时候才会触发,当我们第一次分割以后,

程序会再次在函数parseActionname对mapping里面的name进行解析,这时候会首先按照!叹号动态的格式来从actionname中切割出动态的method,具体变量调试如下

这里我们可以看到,经过parseActionName,method变成了student!add.action中的动态方法add,所以从这块开始就跟我们构造的利用代码没有半毛钱关系了,所以我们后缀在后面的利用代码不会被执行了

之前在北分学习时候和还有在045和046的客户反馈中,我们确实遇到了这样的情况,就是客户只是用action加我们的poc去验证,但是没有验证出来漏洞,但是看版本确实又在受影响的版本范围,这时候,我们去看这个链接的特点,就是这样通过叹号(!)来调用动态方法的链接特点。这时候只要我们去还原出真正的action入口,把动态方法切割掉,再次利用,通过调试我们可以看到此时method就会变成我们真正想要执行的东西。

这样的页面一般通过爬虫是无法抽取出真正的action入口的,需要在爬虫里面自己加规则变化,扫描器这边可以看下是否有这种漏洞。

第三种:就是通配符调用,struts2是不推荐用感叹号动态调用的,所以通配符形式反而是比较推荐和常用的一种调用方式,因为它使用起来非常的简单,前面是*甚至可以写*_*,后面通过{1} {0}来匹配,本来这种方法是不需要开启DMI的,但是因为之前的版本里面这个是默认开启的,所以这块也会有代码执行的问题。

就写了这么多了,对于这快只是了解了这么多,如果有不对的地方,请大家不吝赐教,感谢陶大师对我的帮助。

如果您需要了解更多内容,可以
加入QQ群:570982169
直接询问:010-68438880



发表评论