Struts2再曝S2-020补丁绕过漏洞 – 万恶的正则表达式

简介:

Apache Struts 2.0.0-2.3.16版本的默认上传机制是基于Commons FileUpload 1.3版本,其附加的ParametersInterceptor允许访问'class' 参数(该参数直接映射到getClass()方法),并允许控制ClassLoader。在具体的Web容器部署环境下(如:Tomcat),攻击者利用 Web容器下的Java Class对象及其属性参数(如:日志存储参数),可向服务器发起远程代码执行攻击,进而植入网站后门控制网站服务器主机。

让我们一起来回顾一下Struts缝缝补补的历史(万恶的正则表达式):

2007年1月:

dojo..*
2008年6月:

dojo..,^struts..
2012年3月:

dojo..,^struts..,^session..,^request..,^application..,^servlet(Request|Response)..,parameters...*
2013年10月:

^dojo..,^struts..,^session..,^request..,^application..,^servlet(Request|Response)..,^parameters..,^action:.,^method:.*
2014年3月(S2-020):

^class..,^dojo..,^struts..,^session..,^request..,^application..,^servlet(Request|Response)..,^parameters..,^action:.,^method:.
漏洞详情:Struts 2.3.15.1之前的版本,参数action的值redirect以及redirectAction没有正确过滤,导致ognl代码执行。

修复方式:将 '^class.*'添加到excludeParams列表内

2014年4月……

000038263.png

从目前公布的信息来看,这个漏洞的局限性很高,利用范围仍然有限。

目前官方在GitHub上对该问题做出了修正(临时)。

代码修复详情:

https://github.com/apache/struts/commit/aaf5a3010e3c11ae14e3d3c966a53ebab67146be#diff-710b29900cea21e85893cae43dd08c92

core/src/main/resources/struts-default.xml

  • ^class..,^dojo..,^struts..,^session..,^request..,^application..,^servlet(Request|Response)..,^parameters..,^action:.,^method:. + (..|^)class..,^dojo..,^struts..,^session..,^request..,^application..,^servlet(Request|Response)..,^parameters..,^action:.,^method:.*
    请注意多处都要修改。

在4月24日下午,又有同学贴出了终极修改方案:

修改struts源码

com.opensymphony.xwork2.interceptor.ParametersInterceptor

将此处代码:

public void setExcludeParams(String commaDelim) {
        Collection<String> excludePatterns = ArrayUtils.asCollection(commaDelim);
        if (excludePatterns != null) {
            excludeParams = new HashSet<Pattern>();
            for (String pattern : excludePatterns) {
                excludeParams.add(Pattern.compile(pattern));
            }
        }
    }

修改为:

public void setExcludeParams(String commaDelim) {
        Collection<String> excludePatterns = ArrayUtils.asCollection(commaDelim);
        if (excludePatterns != null) {
            excludeParams = new HashSet<Pattern>();
            for (String pattern : excludePatterns) {
                excludeParams.add(Pattern.compile(pattern));
            }
        }
        //s021 zhenzheteng
        Pattern s021_1 = Pattern.compile("(.*\\.|^)class\\..*",Pattern.CASE_INSENSITIVE);
        Pattern s021_2 = Pattern.compile(".*'class&'.*",Pattern.CASE_INSENSITIVE);
        Pattern s021_3 = Pattern.compile("(.*\\.|^)class\\[.*",Pattern.CASE_INSENSITIVE);
        excludeParams.add(s021_1);
        excludeParams.add(s021_2);
        excludeParams.add(s021_3);
    }

文章转载自 开源中国社区 [http://www.oschina.net]

目录
相关文章
|
4月前
|
Python
Python 内置正则表达式库re的使用
正则表达式是记录文本规则的代码,用于查找和处理符合特定规则的字符串。在Python中,常通过原生字符串`r&#39;string&#39;`表示。使用`re.compile()`创建正则对象,便于多次使用。匹配字符串有`match()`(从开头匹配)、`search()`(搜索首个匹配)和`findall()`(找所有匹配)。替换字符串用`sub()`,分割字符串则用`split()`。
56 3
|
3月前
|
数据库 Python
Python网络数据抓取(8):正则表达式
Python网络数据抓取(8):正则表达式
33 2
|
3月前
|
自然语言处理 JavaScript 前端开发
Python高级语法与正则表达式(二)
正则表达式描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。
|
3月前
|
安全 算法 Python
Python高级语法与正则表达式(一)
Python提供了 with 语句的写法,既简单又安全。 文件操作的时候使用with语句可以自动调用关闭文件操作,即使出现异常也会自动关闭文件操作。
|
3月前
|
Python
Python使用正则表达式分割字符串
在Python中,你可以使用re模块的split()函数来根据正则表达式分割字符串。这个函数的工作原理类似于Python内置的str.split()方法,但它允许你使用正则表达式作为分隔符。
|
3月前
|
Python
Python中re模块的正则表达式
【6月更文挑战第2天】了解Python的re模块,它是处理正则表达式的核心工具。正则表达式用于在文本中查找特定模式。本文讨论了re模块的用法和技巧,包括导入模块、匹配、分组、替换文本、编译正则表达式以及使用预定义字符类、量词、锚点等高级功能。通过实例展示了如何在Python中执行这些操作,帮助提升文本处理能力。掌握这些技巧将使你更有效地利用正则表达式解决字符串处理问题。
33 2
|
3月前
|
Python
Python正则表达式详解:掌握文本匹配的魔法
Python正则表达式详解:掌握文本匹配的魔法
|
3月前
|
Python
python re 正则表达式库的使用
python re 正则表达式库的使用
29 0
|
3月前
|
Python
python正则表达式入门
python正则表达式入门