🔍 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注解类型执行逻辑分析👉
🧪 黑盒测试常见“盲测”方式
🛠️ 方法一:输入表达式触发异常,看错误信息
比如:
输入:${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 | 高度怀疑 SpEL 或 OGNL 注入 |
参数传入后页面内容发生动态变化 | 尝试拼接表达式做盲测 |
有自定义规则引擎、工作流、权限控制等 | 必查是否使用 SpEL 做解析 |
🔍 四、总结
🕵️♂️ 测试 payload
类型 | 探测表达式 | 说明 |
---|---|---|
基本探针 | 1+1 , #{1+1} ,Hello#{1+1} | 若返回 2或Hello2,表示表达式 被解析执行 |
响应试探 | #{null} ,${1+1} ,#{季升安全} | 查看响应内容与报错信息 |
类型访问 | T(java.lang.System).getProperties() | 读取系统属性 |
命令执行 | T(java.lang.Runtime).getRuntime() .exec('id') | RCE 检测 |
🔬 黑盒特征表现
- 请求中某字段变化时响应不同(例如从
#{1+1}
返回2
) - 报错信息中出现
org.springframework.expression
、SpelEvaluationException
等关键字 - 输入表达式后服务异常崩溃或超时
✅ 提示
黑盒测试不是瞎试,要懂业务逻辑+关键位置定位+表达式构造。
看到规则解析、模板渲染、权限校验时,脑中自动响起:“有没有 SpEL 注入的可能?”
暂无评论内容