安全漏洞预警公告-Struts2存在远程命令执行漏洞 --终极解决方案

struts2支持url?action:%{ognl expr}形式指定调用action,这种方式绕过了struts2的默认拦截器对action名称的限制,后续框架默认代码逻辑会对action名称做OGNL解析。所以导致远程代码执行漏洞。

所有的struts2项目,默认都存在这个漏洞,没有幸免。

 

解决方案:

应用该方案后,攻击者只能读取一些sessionapplication中的内容,无法做危险操作。

       原理是,在OGNL执行之前,对语句做判断,看到有不好的代码,就干掉。理论上,开发人员不会自己写OGNL用于操作文件,执行命令等。

       Ognl.Ognl类,public static Object parseExpression(String expression)函数添加如下代码:

    public static Object parseExpression(String expression)

            throws OgnlException {

        // hackedbykxlzx

        String evalMethod[] = { "Runtime""new file""PrintWriter",

                "new java.io.File""ProcessBuilder""Response""Stream",

                "exit""Thread" };

        String methodString = null;

        methodString = expression.toLowerCase();

        for (int i = 0; i < evalMethod.length; i++) {

            if (methodString.indexOf(evalMethod[i].toLowerCase()) > -1) {

                System.out.println("OGNL证在执行恶意语句" + methodString

                        + "!看到这个消息,请联系安全工程师!!!");

                throw new OgnlException("OGNL证在执行恶意语句" + methodString

                        + "!看到这个消息,请联系安全工程师!!!");

            }

        }

 

        try {

            OgnlParser parser = new OgnlParser(new StringReader(expression));

            return parser.topLevelExpression();

        } catch (ParseException e) {

            throw new ExpressionSyntaxException(expression, e);

        } catch (TokenMgrError e) {

            throw new ExpressionSyntaxException(expression, e);

        }

    }

 

 

       其中”//hackedbykxlzx”部分是添加的内容。

你可能感兴趣的:(struts2)