SpEL 漏洞渗透测试实战:全网最全姿势集合!
SpEL 漏洞渗透测试实战:全网最全姿势集合!
原创 火力猫 季升安全 2025-04-21 08:52
🔍 SpEL 黑盒探测不止靠 1+1,还可以这样搞!
提到 SpEL 注入,很多人黑盒测试的第一反应就是试试 1+1
看看会不会变成 2
。但真正在实战中,SpEL 的“藏身之处”远不止那么简单!它可能伪装在表达式参数、权限注解、规则引擎,甚至是配置文件中。
本文将带你深入挖掘黑盒测试中如何精准识别 SpEL 注入点,告别盲猜,掌握一整套实战套路。
🧠 什么是 SpEL?快速回顾
SpEL,全称 Spring Expression Language
,是 Spring 框架提供的表达式语言,支持执行对象访问、调用方法、条件判断等。常用于配置注入、权限控制、动态模板等功能中。
✅ 合法用法示例:
@Value("#{user.name}")private String userName;
❌ 危险用法示例:
@Value("#{${user.input}}") // 用户控制的内容作为表达式的一部分private String unsafe;
SPEL注解类型执行逻辑分析👉注解中的 SpEL 表达式执行原理与注入风险详解
🧪 黑盒测试常见“盲测”方式
🛠️ 方法一:输入表达式触发异常,看错误信息
比如输入:
${1+1} 或 #{Geekserver}
如果页面报错,提示有 SpelEvaluationException
、ELException
、Cannot evaluate expression
,说明可能用到了 SpEL。
🛠️ 方法二:测试内容拼接
尝试输入:
?expr=1+1 => 是否返回 2??expr='a'+'b' => 是否返回 ab?
这虽然有用,但效率低、命中率低、误报高,下面带你解锁更多高级技巧。
尝试输入:
Hello#{1+1}
如果返回:
Hello2
说明表达式被执行了,那么存在SPEL注入的可能行大大提升。
🛠️ 方法三:尝试访问 Java 类,看是否能访问到类型系统
输入类似:
?expr=T(java.lang.System).getProperty('os.name')
如果页面返回了系统信息,比如 Windows 10
、Linux
,那大概率就是 SpEL。
🛠️ 方法四:旁敲侧击看返回格式
尝试输入:
#{null}
如果页面返回空白或报错 SpelEvaluationException
,而传普通字符串却没事,说明它把输入当表达式处理了。
🎯 二、哪些功能点常用 SpEL?
1. Spring @Value 注解
开发者常写:
@Value("${user.name}")private String name;
但如果用了:
@Value("#{request.getParameter('exp')}")
就可能引起注入!
2. 权限控制(Spring Security)
开发者可能写:
@PreAuthorize("hasRole('ROLE_ADMIN')")
但如果参数是动态的,比如:
@PreAuthorize("#{T(com.example.SpelHelper).getExpressionFromDb()}")
从其他类或方法提取模板参数 → 存在注入风险。
3. 数据展示模板(Thymeleaf, JSP)
页面里用了:
<p>${user.name}</p>
而后台没做安全处理,也可能支持 SpEL 表达式注入。
4. 日志/规则/自定义脚本系统
比如用户能写规则条件:
{"rule": "price > 100 and category == 'food'"}
这类业务系统常用 SpEL 作为解析引擎,如果不做限制,用户就能传:
T(java.lang.Runtime).getRuntime().exec('calc')
5. 配置文件注入点(YAML/Properties)
比如 Spring Boot 的配置文件中:
my.value:"#{systemProperties['user.home']}"
如果这个值是从用户那动态加载的,比如远程配置中心,也可能被注入!
6.常见的系统类型
-
电商优惠规则系统
-
自定义工作流引擎的系统
-
策略管理系统
🔎 三、黑盒遇到这些“特征”,你就该尝试 SpEL 探测了!
|
|
---|---|
expression , rule , formula , script ,expr ,el ,spel |
|
EvaluationException |
|
|
|
|
|
🔍 四、总结
🕵️♂️ 测试 payload
|
|
|
---|---|---|
|
1+1
#{1+1} ,Hello#{1+1} |
|
|
#{null}
${1+1} ,#{季升安全} |
|
|
T(java.lang.System).getProperties() |
|
|
T(java.lang.Runtime).getRuntime().exec('id') |
|
🔬 黑盒特征表现
-
请求中某字段变化时响应不同(例如从 #{1+1}
返回 2
) -
报错信息中出现 org.springframework.expression
、SpelEvaluationException
等关键字 -
输入表达式后服务异常崩溃或超时
💡 提示
黑盒测试不是盲目尝试,要懂业务逻辑+关键位置定位+表达式构造
。
看到规则解析、模板渲染、权限校验时,脑中自动响起:“有没有 SpEL 注入的可能?”