.ObjectFactory" name="xwork" /> <bean type="com.opensymphony.<em>xwork</em>2.ObjectFactory" name="struts" " name="<em>xwork</em>" scope="singleton"/> <bean type="com.opensymphony.<em>xwork</em>2.FileManagerFactory" class= type="com.opensymphony.<em>xwork</em>2.ActionProxyFactory" name="<em>xwork</em>" class="com.opensymphony.<em>xwork</em>2.DefaultActionProxyFactory "com.opensymphony.xwork2.TextProvider" name="system" class="com.opensymphony.xwork2.DefaultTextProvider /> <bean class="com.opensymphony.<em>xwork</em>2.ognl.OgnlUtil" /> <bean type="com.opensymphony.<em>xwork</em>2
.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:348) at com.opensymphony.xwork2 (MethodFilterInterceptor.java:86) at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling (DefaultActionInvocation.java:224) at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:143) at com.opensymphony.xwork2 at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:143) at com.opensymphony.xwork2
.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:404) at com.opensymphony.xwork2. com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221) at com.opensymphony.xwork2 com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221) at com.opensymphony.xwork2 com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221) at com.opensymphony.xwork2 com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221) at com.opensymphony.xwork2
) for (com.opensymphony.xwork2.conversion.impl.DateConverter) 2014-7-10 23:28:26 com.opensymphony.xwork2 ) for (com.opensymphony.xwork2.conversion.impl.StringConverter) 2014-7-10 23:28:26 com.opensymphony.xwork2 ) for (com.opensymphony.xwork2.conversion.ConversionFileProcessor) 2014-7-10 23:28:26 com.opensymphony.xwork2 ) for (com.opensymphony.xwork2.conversion.TypeConverterCreator) 2014-7-10 23:28:26 com.opensymphony.xwork2 ) for (com.opensymphony.xwork2.conversion.ObjectTypeDeterminer) 2014-7-10 23:28:26 com.opensymphony.xwork2
未解决的报错问题 2018-07-05 17:12:37,135 ERROR [com.opensymphony.xwork2.interceptor.ParametersInterceptor] - uploadContentType' with value ['application/msword', ] - [unknown location] at com.opensymphony.xwork2 :98) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) :98) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) :191) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
at ognl.ObjectPropertyAccessor.setProperty(ObjectPropertyAccessor.java:162) at com.opensymphony.xwork2 :170) at com.opensymphony.xwork2.ognl.OgnlValueStack.setParameter(OgnlValueStack.java:148) at :98) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) :98) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) :191) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
.inject.ContainerImpl$5.create(ContainerImpl.java:311) 10 at com.opensymphony.xwork2.inject.ContainerImpl .inject.util.ReferenceCache.internalCreate(ReferenceCache.java:76) 15 at com.opensymphony.xwork2. :204) 18 at com.opensymphony.xwork2.inject.Scope$2$1.create(Scope.java:51) 19 at com.opensymphony.xwork2 :484) 22 at com.opensymphony.xwork2.inject.ContainerImpl.callInContext(ContainerImpl.java:580) 23 at com.opensymphony.xwork2.inject.ContainerBuilder.create(ContainerBuilder.java:484) 24 at com.opensymphony.xwork2
XWork、WebWork的许多功能都是有Interceptor实现,可以在配置文件中组装Action用到的Interceptor,它会按照你指定的顺序,在Action执行前后运行。 " /> < interceptor name ="chain" class ="com.opensymphony.<em>xwork</em>2.interceptor.ChainingInterceptor" /> " /> < interceptor name ="params" class ="com.opensymphony.<em>xwork</em>2.interceptor.ParametersInterceptor" /> < interceptor name ="prepare" class ="com.opensymphony.<em>xwork</em>2.interceptor.PrepareInterceptor" /> .validator.ValidationInterceptor" /> < interceptor name ="workflow" class ="com.opensymphony.<em>xwork</em>2.
”; public static final String SESSION = “com.opensymphony.xwork2.ActionContext.session”; public static final String APPLICATION = “com.opensymphony.xwork2.ActionContext.application”; public static final String PARAMETERS = “com.opensymphony.xwork2.ActionContext.parameters”; public static final String LOCALE = “com.opensymphony.xwork2.ActionContext.locale”; public static final String TYPE_CONVERTER = “com.opensymphony.xwork2 .ActionContext.typeConverter”; public static final String ACTION_INVOCATION = “com.opensymphony.xwork2
系统提供了能满足大部分验证需求的校验器,可在xwork-core-2.X.X.jar的com.opensymphony.xwork2.validator.validators下的default.xml中找到 </message> </field-validator> 4、补充 在xwork-core-2.3.29.jar包下com/opensymphony/xwork2/validator/validators DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator Definition 1.0//EN" "http ://struts.apache.org/dtds/xwork-validator-definition-1.0.dtd"> <! -- END SNIPPET: validators-default --> 在xwork-core-2.3.29.jar包下包含了几个关于validator的dtd文件
com.ming.HelloWorldAction.getName(), property: name] 2019-03-24 03:50:19.232 [INFO ] com.opensymphony.xwork2 可以看到这个action一共运行耗时12ms 自定义拦截器 需要继承该抽象类,并实现其方法 即 com.opensymphony.xwork2.interceptor.AbstractInterceptor 抽象类 代码如下 package com.ming; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2 Exception { return null; } } 实现该类的interceptor方法 package com.ming; import com.opensymphony.xwork2 result name="error">/error.html</result> 效果如下 控制台输出结果如下 2019-03-24 04:37:24.086 [DEBUG] com.opensymphony.xwork2
.ognl.accessor), XWorkMethodAccessor.java callMethod:90, XWorkMethodAccessor (com.opensymphony.xwork2 (com.opensymphony.xwork2), DefaultActionInvocation.java invoke:254, DefaultActionInvocation (com.opensymphony.xwork2 ), RestrictHttpMethodInterceptor.java invoke:249, DefaultActionInvocation (com.opensymphony.xwork2), ), PrepareInterceptor.java intercept:99, MethodFilterInterceptor (com.opensymphony.xwork2.interceptor ), DefaultActionInvocation.java intercept:21, FlashScopeInterceptor (com.atlassian.confluence.xwork),
#req=@org.apache.struts2.ServletActionContext@getRequest(),#response=#context.get(“com.opensymphony.xwork2 (#_memberAccess=#dm):((#container=#context[‘com.opensymphony.xwork2.ActionContext.container’]). (#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)). (#cr=#ct[‘com.opensymphony.xwork2.ActionContext.container’]). (#ou=#cr.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).
{com.opensymphony.xwork2.ActionContext.locale=zh_CN, request={struts.actionMapping=ActionMapping{name .ActionContext.actionInvocation=com.opensymphony.xwork2.DefaultActionInvocation@742c6377, session={}, xwork.NullHandler.createNullObjects=false, com.opensymphony.xwork2.util.ValueStack.ValueStack=com.opensymphony.xwork2 @4cb71783, com.opensymphony.xwork2.ActionContext.container=com.opensymphony.xwork2.inject.ContainerImpl @7888eafe, com.opensymphony.xwork2.ActionContext.parameters={}, com.opensymphony.xwork2.dispatcher.ServletContext
XWork、WebWork的许多功能都是有Interceptor实现,可以在配置文件中组装Action用到的Interceptor,它会按照你指定的顺序,在Action执行前后运行。 ”/> <interceptor name=”modelDriven”class=”com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor ”/> <interceptor name=”params”class=”com.opensymphony.xwork2.interceptor.ParametersInterceptor”/> < interceptor.ActionMappingParametersInteceptor”/> <interceptor name=”prepare”class=”com.opensymphony.xwork2 package ceshi; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor
-2.3.16.3.jar ---》com.opensymphony.xwork2.validator.validators ---》default.xml <? ://struts.apache.org/dtds/xwork-validator-definition-1.0.dtd"> <! -2.3.16.3.jar/xwork-validator-1.0.3.dtd复制一下dtd的头文件: <? /dtds/xwork-validator-1.0.3.dtd"> 1 package com.bie.lesson11; 2 3 import com.opensymphony.xwork2. ://struts.apache.org/dtds/xwork-validator-1.0.3.dtd"> 5 <validators> 6 7 <!
.Action; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven; public .Action; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven; public .Action; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven; public class StudentAction3 extends ActionSupport implements .Action; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven; import
(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']). (#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)). (#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']). (#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)). (#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).
config.impl.DefaultConfiguration.reloadContainer(DefaultConfiguration.java:168) at com.opensymphony.xwork2 55) ... 16 more Caused by: Connection timed out: connect - [unknown location] at com.opensymphony.xwork2 at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.parse(Unknown Source) at com.opensymphony.xwork2 (Unknown Source) Caused by: Unable to load configuration. - [unknown location] at com.opensymphony.xwork2 55) ... 16 more Caused by: Connection timed out: connect - [unknown location] at com.opensymphony.xwork2
3.2.3.4 触发的核心逻辑: 本质就是xwork的漏洞,使用到了OgnlUtil.setValue,例如直接在低版本xwork环境下运行如下命令即可rce,图4所示。 图5 com.opensymphony.xwork2.util.OgnlValueStack#setValue 根据网上的PoC,我们可以了解到,需要将 context 的 xwork.MethodAccessor.denyMethodExecution :329, OgnlValueStack (com.opensymphony.xwork2.ognl) findValue:313, OgnlValueStack (com.opensymphony.xwork2 .ognl) findValue:374, OgnlValueStack (com.opensymphony.xwork2.ognl) evaluate:161, TextParseUtil$1 (com.opensymphony.xwork2 (com.opensymphony.xwork2.util) translateVariables:130, TextParseUtil (com.opensymphony.xwork2.util)