前言
S2-048漏洞和struts2-struts1-plugin插件有关,该插件用于将Struts1的action也能在struts2上运行,提高兼容性(作用是我猜的~)
正文
我们先看下这个插件对应的配置文件
可以看到我们访问名为saveGangster的action时,处理它的并不是SaveGangsterAction,而是插件中的一个action类org.apache.struts2.s1.Struts1Action,最后是将SaveGangsterAction类以一个参数的形式传给了Struts1Action。我们看下Struts1Action的内部实现:
可以看到其实还是调用了SaveGangsterAction的exec来处理业务,然后再取出request中的“action_message”属性进行循环放入getText方法中,getText我们之前分析过,里面会只需Ognl表达式。我们只需跟进SaveGangsterAction的exec中看下该属性是否可控就好了:
里面的逻辑其实很简单,就是获取了actionform(可控的)中的name参数后进行字符串拼凑用于生成ActionMessage,然后在addMessages方法中加入到了request属性中
测试一下:
poc用以前的就好了:
${#_memberAccess=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS,#cmd='calc',#cmds={'cmd.exe','/c',#cmd},#p=new java.lang.ProcessBuilder(#cmds),#process=#p.start()}
不过感觉这个洞是也是难以批量啊。