S2-029
前言
S2-029漏洞是由于Struts2的i18n、text标签中的name属性的值会经过两次Ognl表达式解析。
正文
假设有如下缺陷代码:
jsp文件中使用Struts2的i18n标签获取请求中的参数“jinqi”,放入了attribute中。struts2的i18n标签中的name属性通过%{}的形式读取该参数值后将该值当作ognl表达式处理(这是第一次ognl表达式处理,这是因为struts2的标签中本来就是通过OgnlValueStack值栈来取值的)。
访问http://localhost:8088/struts2-showcase-2.1.6/S2-029.jsp?jinqi=aaaa,在I18n.class的start方法中打断点停下来看看:
跟进findString方法中:
TextParseUtil.translateVariables这个方法我们之前分析过,就是将expr中%{}里面的字符串当作ongl表达式解析,此时%{}里面包含的字符串是#request.jinqi,也就是说读取request对象中的jinqi属性,而jinqi属性的值在上面是我们可控的,此时是aaaa,回到I18n.class的start方法中:
可以看到,此时获取的name就是aaaa,然后用作字符串拼凑后,放入了findValue方法中,跟进该方法:
很明显,调用了OgnlValueStack.findValue(),我们知道这个方法里面也是将输入的参数当作了Ognl表达式执行,此时的参数expr是getTexts('aaaa'),由于aaaa是受我们控制的,且该参数值是直接通过字符串拼凑的,我们只需要将字符串前半部分 getTexts(' 和后半部分 ') 闭合掉就好了,中间接我们的poc就好了。
本地windows测试用的弹计数器的poc(get请求,所以用的url编码):%27)%2c%23cmd%3d%27calc%27%2c%23cmds%3d%7b%27cmd.exe%27%2c%27%2fc%27%2c%23cmd%7d%2c%23p%3dnew+java.lang.ProcessBuilder(%23cmds)%2c%23process%3d%23p.start()%2cnew+java.lang.String(%27
总结
本来还想整个有回显的poc出来的,但是一直没成功,后来想想这个漏洞利用起来较为麻烦,难以批量,于是就放弃了,这个漏洞就当了解算了。