EL表达式的执行限制及绕过

💡 原文中文,约2100字,阅读约需5分钟。
📝

内容提要

本文探讨了EL表达式的注入及其动态执行特性,分析了如何在JSP中通过反射和JS引擎执行命令。EL表达式被解析为Node节点,利用Ast类进行方法调用和参数处理,最终实现命令执行。同时,学习到EL表达式中的getter方法调用也能获取属性值,增强了对EL表达式的理解。

🎯

关键要点

  • EL表达式的注入利用其动态执行特性,通过反射或JS引擎执行命令。

  • EL表达式解析为Node节点,在JSP中通过proprietaryEvaluate方法解析为ValueExpression。

  • 通过AstValue#getValue执行表达式,遍历每个子节点并调用方法。

  • 核心执行在ElResolver#invoke方法中,使用BeanELResolver解析器进行反射调用。

  • Node节点AstMapData返回HashMap,AstConcatenation拼接字符串,AstLambdaExpression执行lambda表达式。

  • AstBracketSuffix处理[]中的数据,类似于.的调用方式。

  • EL表达式中的getter方法调用获取属性值,增强对EL表达式的理解。

  • 通过param.x传入参数执行命令,getter/setter通过调用对应属性的getter方法获取值。

🔎

延伸解读

EL表达式的动态特性

EL表达式的动态执行特性使其在Web开发中具有灵活性,但也带来了安全隐患。开发者需注意,恶意用户可能利用这一特性进行注入攻击,因此在使用EL表达式时应加强输入验证和安全措施。

反射与命令执行的风险

通过反射机制执行命令虽然提供了强大的功能,但也可能导致严重的安全风险。特别是在处理用户输入时,未经过滤的参数可能导致远程代码执行,开发者应谨慎处理反射调用,确保不暴露敏感操作。

Node节点解析的复杂性

EL表达式的解析过程涉及多个Node节点,理解这些节点的作用对于调试和优化代码至关重要。开发者应熟悉各类节点的功能,如AstMapData和AstConcatenation,以便更有效地处理表达式和提高代码性能。

延伸问答

EL表达式的动态执行特性是什么?

EL表达式的动态执行特性允许通过反射或JS引擎执行命令。

如何在JSP中解析EL表达式?

在JSP中,EL表达式通过proprietaryEvaluate方法解析为ValueExpression。

EL表达式中的getter方法如何工作?

EL表达式中的getter方法通过调用对应属性的getter方法获取属性值。

EL表达式的Node节点是如何构成的?

EL表达式被解析为Node节点,每个节点代表表达式的一部分,使用Ast类进行处理。

AstMapData和AstConcatenation的功能是什么?

AstMapData返回HashMap结构的数据,AstConcatenation用于拼接字符串并返回结果。

如何通过param.x传入参数执行命令?

可以通过param.x的方式传入参数,EL表达式会解析并执行相应的命令。

🏷️

标签

➡️

继续阅读