struts2支持url?action:%{ognl expr}形式指定调用action,这种方式绕过了struts2的默认拦截器对action名称的限制,后续框架默认代码逻辑会对action名称做OGNL解析。所以导致远程代码执行漏洞。
所有的struts2项目,默认都存在这个漏洞,没有幸免。
解决方案:
应用该方案后,攻击者只能读取一些session、application中的内容,无法做危险操作。
原理是,在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”部分是添加的内容。