2014-05-03,距离上个版本发布仅仅过去1周,apache struts官网又发布struts2最新版本安全公告,主要修复了一个 漏洞,代号S2-022:   从漏洞简要描述来看,确定是对之前S2-021的补充。       其实在S2-021漏洞的修补过程可以看出官方已经意识到了cookie拦截器也存在和参数拦截器类似的问题,并且无法使用struts-default.xml配置文件进行正则拦截。主要原因在于如果应用配置某个action使用通配符‘*’接受cookieName,cookie拦截器默认会对所有传入的cookieName进行参数绑定,造成操控class进而影响到classLoader。       从S2-022可以看出,官方只理解到了cookie拦截器操控classLoader问题,虽然在xwork中特定引入一个ExcludedPatterns类:    

public class ExcludedPatterns {

    public static final String CLASS_ACCESS_PATTERN = "(.*\\.|^|.*|\\[('|\"))class(\\.|('|\")]|\\[).*";

    public static final String[] EXCLUDED_PATTERNS = {
            CLASS_ACCESS_PATTERN,
            "^dojo\\..*",
            "^struts\\..*",
            "^session\\..*",
            "^request\\..*",
            "^application\\..*",
            "^servlet(Request|Response)\\..*",
            "^parameters\\..*"
    };

 

        但EXCLUDED_PATTERNS正则匹配只用在了参数拦截器中,cookie拦截器中却只使用了CLASS_ACCESS_PATTERN进行匹配防御:(struts2.3.16.2 CookieInterceptor类部分代码)      

 // Allowed names of cookies
    private Pattern acceptedPattern = Pattern.compile(ACCEPTED_PATTERN, Pattern.CASE_INSENSITIVE);
    private Pattern excludedPattern = Pattern.compile(ExcludedPatterns.CLASS_ACCESS_PATTERN, Pattern.CASE_INSENSITIVE);

 

      excludedPattern只取了CLASS_ACCESS_PATTERN部分。   很明显,classLoader操控漏洞解决了,但是session,request,application等各类web应用变量任意操控问题依然存在,因而有了后续S2-022的出现。       此外,漏洞成功利用的前提是需要应用针对action采用类似如下特定的配置:    

<action name="hello" class="test.helloAction"> 
<interceptor-ref name="defaultStack" />
   <interceptor-ref name="cookie">
        <param name="cookiesName">*</param>
        <param name="cookiesValue">*</param>
   </interceptor-ref>

 

但不保证业务一定不会采用,腾讯安全中心建议广大厂商迅速升级至struts2.3.16.3版本  

    上一篇: 渗透技巧之SSH篇 - 网站安全 - 自学php

    下一篇: Hibernate HQL注入攻击入门 - 网站安全 - 自学php
本博客所有文章如无特别注明均为原创。
复制或转载请以超链接形式注明转自起风了,原文地址《Struts2 S2-022漏洞简要分析 – 网站安全 – 自学php
   

还没有人抢沙发呢~