1.Spring Cache 中的源码表达式求值(及 Spring Cache 小结)
2.如何看待最新爆出的'红雨蘑菇'iis服务器远程代码执行漏洞?
3.25. Spring源码篇之SpEL表达式
4.深入掌握Spring SpEL及其实战应用
Spring Cache 中的表达式求值(及 Spring Cache 小结)
上一章未完部分,本章重点解析Spring Cache中的解析表达式求值机制。Cache注解如key、源码unless、解析condition等,源码支持SpEL表达式。解析有影视源码搭建教程
CacheOperationExpressionEvaluator在CacheAspectSupport中实现,源码其关键在于定义的解析ExpressionKey,实现Comparable接口,源码包含element和expression字段,解析并配备SpelExpressionParser和DefaultParameterNameDiscoverer。源码
ExpressionKey类在解析过程中扮演关键角色,解析它从cache获取表达式,源码若不存在,解析则使用parser执行parseExpression并缓存结果。源码此过程需注意表达式的参数名兼容性,分别在Java 8及以下和Java 8以上版本中使用不同的ParameterNameDiscoverer。
CachedExpressionEvaluator的核心在于解析并缓存表达式,而CacheOperationExpressionEvaluator在其中扮演关键角色,书旗泡吧源码数据它创建CacheEvaluationContext,该上下文在SpEL求值过程中提供方法参数。
CacheOperationExpressionEvaluator中提供了求值关键函数,通过生成CacheEvaluationContext以及调用generateKey等方法,结合SpEL表达式和上下文计算实际值。
总结,Spring Cache的核心源码至此解析完毕。配置由ProxyCachingConfiguration实现,解析注解则由SpringCacheAnnotationParser完成。CacheAspectSupport作为拦截类,通过CacheResolver等进行解析,结合CacheOperationExpressionEvaluator进行表达式求值,最终执行缓存操作。
如何看待最新爆出的'红雨蘑菇'iis服务器远程代码执行漏洞?
Apache ActiveMQ官方发布新版本,修复了一个远程代码执行漏洞(CNVD-- CVE--)。该漏洞允许攻击者通过Apache ActiveMQ的端口发送恶意数据,从而导致远程代码执行,完全控制服务器。出击加仓主图源码影响的版本包括环境搭建的多个阶段。考虑到没有找到合适的Docker镜像,我们尝试自己编写并分析Dockerfile,结合官方文档,使用docker-compose.yml进行环境配置。
在漏洞分析阶段,我们下载源代码,并在apache-activemq-5..2\bin\activemq文件中开启调试模式。通过github.com/apache/activm找到新版本修复的漏洞位置,即org.apache.activemq.openwire.v.BaseDataStreamMarshaller#createThrowable方法。该方法允许控制ClassName和message,进而调用任意类的String构造方法。结合ActiveMQ内置的Spring框架,利用org.springframework.context.support.ClassPathXmlApplicationContext加载远程配置文件实现SPEL表达式注入。
为了深入学习,我们整理了一份全套资料,包括网安学习成长路径思维导图、+网安经典常用工具包、俄罗斯交易系统源码+SRC分析报告、+网安攻防实战技术电子书、权威CISSP认证考试指南、最新网安大厂面试题合集、APP客户端安全检测指南(安卓+IOS)等资源,帮助网安学习者全面成长。
在寻找漏洞触发点的过程中,我们关注到org.apache.activemq.ActiveMQSession#asyncSendPacket和org.apache.activemq.ActiveMQSession#syncSendPacket函数可以发送command,最后调用org.apache.activemq.transport.tcp.TcpTransport#oneway或((ActiveMQConnection)connection).getTransportChannel().oneway/expetionResponse;进行触发。由于ExceptionResponse实例化需要Throwable类型,我们修改ClassPathXmlApplicationContext继承Throwable类型以实现触发。
通过数据流触发ExceptionResponseMarshaller,主要是依据ActiveMQ协议,利用伪造类实现触发ExceptionResponse。利用org.apache.activemq.transport.tcp.TcpTransport#readCommand与wireFormat.unmarshal数据处理逻辑,我们找到对应的wireFormat.marshal,最终通过本地重写TcpTransport类优先触发本地实现,将发送请求修改为触发ExceptionResponseMarshaller。n2n源码解析同样,修改ClassPathXmlApplicationContext继承Throwable类型以满足ExceptionResponse实例化需求。
总结以上步骤,我们完成了对Apache ActiveMQ远程代码执行漏洞的复现与分析,强调了安全实践的重要性并提供了一系列资源支持,以帮助网络安全专业人士深入学习与应对类似威胁。
. Spring源码篇之SpEL表达式
Spring的SpEL表达式,即Spring Expression Language,是Spring框架中实现复杂功能的关键组件。在Spring中,独立的spring-expression模块用于支持这一功能。本文将提供对SpEL表达式源码的简要分析,以帮助理解其基本用法。 在AbstractBeanFactory中,有一个名为beanExpressionResolver的属性,用于配置默认的表达式解析器。在初始化BeanFactory时,通过AbstractApplicationContext#prepareBeanFactory设置默认值,该值默认为开启状态,可通过配置参数spring.spel.ignore=false来关闭表达式功能。 核心解析组件是BeanExpressionResolver,它提供了evaluate方法,用于解析传入的表达式并返回结果。作为实现类,StandardBeanExpressionResolver具体实现evaluate方法,执行解析任务。 解析SpEL表达式的接口是ExpressionParser,它接收表达式和ParserContext,后者定义了解析规则。关键子类包括SpelExpressionParser、InternalSpelExpressionParser和TemplateAwareExpressionParser。在解析过程中,会调用TemplateAwareExpressionParser#parseExpressions方法,该方法进一步调用InternalSpelExpressionParser#doParseExpression,实现表达式的详细解析。解析流程的关键步骤是tokenizer.process和eatExpression方法,它们负责识别和处理特殊字符以及逻辑运算。 SpEL表达式本质上是一个语法树结构,涉及复杂的运算、对象访问和方法调用。它支持的字符规范包括括号、逻辑运算符(如or、and)、比较运算符(如>、<)、点号(用于访问对象属性)、问号(用于条件判断)、美元符号(用于访问变量)等。 以下是使用SpEL表达式的简单示例:案例一
输出特定值或表达式的结果。案例二
对数据集进行处理,例如筛选、排序或计算。案例三
执行对象方法,如调用实例方法或访问静态方法。案例四
使用SpEL获取Spring容器中的Bean实例,包括使用@和&注解来分别获取普通Bean和FactoryBean。 通过以上分析,我们大致了解了SpEL表达式的功能和基本用法。理解这些关键类及其功能有助于在实际开发中灵活运用SpEL,提高代码的可维护性和可读性。尽管SpEL的实现细节复杂,掌握其核心概念和用法足以应对常见的应用场景。深入掌握Spring SpEL及其实战应用
Spring Spring Expression Language(SpEL)是一种强大的表达式语言,支持运行时对象图的查询和操作。它类似于Unified EL,但增加了方法调用和基本字符串模板功能。SpEL是Spring家族产品中受支持的表达式语言,用于创建安全、灵活的应用。
在Spring Security中,四个关键注解用于安全控制:PreAuthorize、PostAuthorize、PreFilter、PostFilter。它们接收SpEL表达式。例如:
hasAuthority('ROLE_ADMIN') or #reqVo.sysUser.username == #userDetails.username
表示:当前登录用户必须拥有ROLE_ADMIN权限,或username匹配,才允许进入findUsers方法。
hasAuthority('ROLE_ADMIN') or (#reqVo.username == #userDetails.username and !T(org.springframework.util.StringUtils).isEmpty(#reqVo.password))
意味着:当前登录用户必须有ROLE_ADMIN权限,且username匹配且password非空,才允许进入updatePassword方法。
通过SpEL,可实现安全控制,其用途广泛,但应避免复杂安全表达式和嵌入无关业务逻辑,以免难以测试和调试。
SpEL可用于创建自定义功能,如接口加锁,避免重复用户名。通过注解和SpEL表达式,可实现此功能,且Spring Security注解处理也是按此法实现。
SpEL具备多种强大功能,例如读取系统属性、解析基本类型数据、调用方法、解析对象属性值、调用Java类静态方法、注册方法和对象变量引用、处理null值和安全调用、进行List运算、访问map等。具体用法可参考官方文档。
项目源码可在GitHub和Gitee上找到,代码同步更新。