1.学习编程|Spring源码深度解析 读书笔记 第5章:容器的源码功能扩展
2.深入掌握Spring SpEL及其实战应用
3.Spring Cache 中的表达式求值(及 Spring Cache 小结)
4.Spring Cloud Function SPEL漏洞
5.如何看待最新爆出的'红雨蘑菇'iis服务器远程代码执行漏洞?
6.深入浅出聊一下Spring@ConfigurationProperties
学习编程|Spring源码深度解析 读书笔记 第5章:容器的功能扩展
深入理解Spring容器的扩展功能:学习笔记
作者:牛客网-张学友
在Spring框架中,容器功能的源码扩展是其强大和灵活的关键。首先,源码ApplicationContext相较于BeanFactory,源码提供了更多功能,源码它是源码源码图标切换BeanFactory的子类,包含了其所有功能并有所扩充。源码主要区分点在于ApplicationContext的源码启动过程和其特有的扩展功能。
通过`ClassPathXmlApplicationContext`的源码实例化,开启源码探索之旅。源码在构造函数和`refresh`方法中,源码Spring对配置文件解析,源码并实现了一系列扩展,源码如环境变量处理、源码配置文件加载、源码Spring Expression Language (SPEL)的支持、属性编辑器的注册以及ApplicationContextAwareProcessor的使用等。这些扩展不仅增强了容器的灵活性,还为开发者提供了更丰富的控制选项。
例如,`refresh`方法中包含了初始化准备工作、BeanFactory的获取和定制、XML文件解析、bean定义填充、Spring表达式解析、属性编辑器注册、BeanPostProcessor的处理、依赖处理和国际化功能等。这些步骤体现了Spring框架的高度可扩展性,使得用户可以根据项目需求定制容器行为。
总结来说,夜袭武器源码Spring容器的功能扩展涉及到了配置文件处理、表达式语言、事件监听、国际化等多个方面,使得开发过程更加便捷且易于定制。想了解更多细节,可以参考作者的原文链接和更多读书笔记资源。
深入掌握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,可实现安全控制,其用途广泛,但应避免复杂安全表达式和嵌入无关业务逻辑,typescript编写源码以免难以测试和调试。
SpEL可用于创建自定义功能,如接口加锁,避免重复用户名。通过注解和SpEL表达式,可实现此功能,且Spring Security注解处理也是按此法实现。
SpEL具备多种强大功能,例如读取系统属性、解析基本类型数据、调用方法、解析对象属性值、调用Java类静态方法、注册方法和对象变量引用、处理null值和安全调用、进行List运算、访问map等。具体用法可参考官方文档。
项目源码可在GitHub和Gitee上找到,代码同步更新。
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进行表达式求值,最终执行缓存操作。
Spring Cloud Function SPEL漏洞
Spring框架提供全面的编程和配置模型,为现代基于java的企业应用程序提供支持。Spring Cloud Function中的RoutingFunction类的apply方法在处理请求头中的“spring.cloud.function.routing-expression”参数时,存在Spel表达式注入漏洞。攻击者可通过该漏洞执行任意代码。
漏洞影响范围为3.0.0.RELEASE至3.2.2的版本。在搭建环境时,使用start.spring.io新建Spring Boot项目,json音乐源码IDEA启动后,修改pom.xml配置文件,最后访问.0.0.1:,成功表示搭建环境完成。
漏洞原理在于apply方法解析mon/TemplateAwareExpressionParser/parseExpression()方法中。进一步解析后,调用InternalSpelExpressionParser类的doPareExpression()方法,对源码与字节码进行判断操作,创建SpelExpression对象。最终,完成漏洞触发。
漏洞测试可以参考官方提供的测试用例,例如构造payload进行文件测试。使用payload "touch /tmp/xxxxxx.test.test"。
官方已发布漏洞补丁,但目前暂无更新版本。建议开发者关注Spring Cloud Function的更新动态,及时更新至修复版本,以避免潜在的安全风险。
如何看待最新爆出的'红雨蘑菇'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。同样,修改ClassPathXmlApplicationContext继承Throwable类型以满足ExceptionResponse实例化需求。
总结以上步骤,我们完成了对Apache ActiveMQ远程代码执行漏洞的复现与分析,强调了安全实践的重要性并提供了一系列资源支持,以帮助网络安全专业人士深入学习与应对类似威胁。
深入浅出聊一下Spring@ConfigurationProperties
当使用Spring框架时,配置文件中的属性获取是常见的需求,比如设置邮件服务器配置。本文将深入讲解如何利用@ConfigurationProperties注解来实现这一功能,并进行扩展。
首先,确保在pom.xml中添加必要的依赖,如spring-boot-starter-parent和spring-boot-starter-validation,用于属性验证。接下来,定义一个单独的配置类,使用@Configuration注解,Spring会为此创建一个Bean,自动与配置文件中以'mail'为前缀的属性绑定。
从Spring Boot 2.2开始,无需额外注解,配置类将自动扫描。只需在Application类中,使用@ConfigurationPropertiesScan注解扫描配置类所在的包。例如,配置类与属性文件的对应关系可以这样设置:
如果你的配置需要更复杂,如嵌套属性或第三方类,可以在@Bean方法上使用@ConfigurationProperties,确保代码整洁并易于管理。
对于属性验证,可以在配置类中添加字段级别的验证,失败时应用启动会报错。此外,还可以利用Spring提供的属性转换功能,如Duration和DataSize,简化时间或数据大小的处理。
自定义属性转换器是另一个高级特性,通过实现Converter接口,可以将属性转换成特定的类。例如,创建一个Book转换器并应用到配置文件中。
与@Value注解相比,@ConfigurationProperties更推荐使用,尤其是在需要管理大量配置信息的场景中,它能保证前缀和属性名的一致性,且支持SpEL表达式。
最后,深入源码层面,ConfigurationProperties的工作原理是通过BeanPostProcessor在Bean实例化后进行属性绑定,包括验证、忽略无效或未知字段等步骤。通过理解这个过程,我们可以更好地控制和管理应用的配置。
总结来说,@ConfigurationProperties是Spring配置文件处理中的强大工具,它简化了属性绑定和管理,使得应用配置更加灵活和高效。
. 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的实现细节复杂,掌握其核心概念和用法足以应对常见的应用场景。