【漏洞分析】struts2漏洞中关于动态方法调用的一点思考
struts2框架是一个比较容易出问题的框架,本篇文章分享strusts2的三种调用方式:制定method调用方式、感叹号!调用和通配符调用,以及漏洞的利用方式。
其中包括了在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入口的,需要在爬虫里面自己加规则变化,扫描器这边可以看下是否有这种漏洞。
3. 通配符调用
struts2是不推荐用感叹号动态调用的,所以通配符形式反而是比较推荐和常用的一种调用方式,因为它使用起来非常的简单,前面是*甚至可以写*_*,后面通过{1} {0}来匹配,本来这种方法是不需要开启DMI的,但是因为之前的版本里面这个是默认开启的,所以这块也会有代码执行的问题。