|
表达式语言注入(EL Injection)——Java应用的暗门 摘要:表达式语言(Expression Language, EL)是Java EE中的一种强大功能,允许在JSP、JSF等视图层动态计算表达式。当应用程序将用户输入直接放入EL求值环境时,黑客可注入恶意EL表达式,调用Java类方法执行任意代码。本文讲解EL注入的利用方式(如访问Runtime类)及防御措施,包括禁用EL、输入过滤和白名单。 关键词:黑客网站攻击;EL注入;渗透测试;Java安全;表达式注入;RCE 一、引言许多Java遗留系统仍使用JSP页面,并通过 ${param.x} 等方式输出数据。如果系统存在一个“动态表达式求值”功能(如规则引擎、模板配置),黑客就能注入${pageContext.request.getSession().setAttribute(...)}等恶意EL表达式,造成会话操纵甚至命令执行。 二、EL注入原理2.1 表达式基础EL语法为 ${expression} 或 #{expression}。其中可以调用静态方法、构造对象等。 2.2 危险场景例如,一个允许用户配置欢迎语的功能: [size=12.573px]java
String message = request.getParameter("msg");ExpressionFactory factory = new ExpressionFactoryImpl();ELContext context = new ELContextImpl();ValueExpression ve = factory.createValueExpression(context, "#{" + msg + "}", String.class);String output = (String) ve.getValue(context);
输入 Runtime.getRuntime().exec("calc") 将导致命令执行。 2.3 常见的EL载荷三、渗透测试中的利用攻击者首先寻找所有可能被EL解析的输入点(请求参数、JSON键值、数据库存储的配置),提交 ${1+1} 观察是否输出 2。确认后可使用更复杂的链式调用来完成黑客入侵,例如通过 Class.forName 加载恶意类。 四、防御措施五、总结EL注入在Java应用中危害极大。开发者应当避免动态编译用户输入的表达式,如必须使用,则采用白名单表达式语法或安全子集。
|