别再只测 1+1!SpEL 注入黑盒实战还有这些高阶姿势

别再只测 1+1!SpEL 注入黑盒实战还有这些高阶姿势

🔍 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}

如果页面报错,提示有 SpelEvaluationExceptionELExceptionCannot 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 10Linux,那大概率就是 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.expressionSpelEvaluationException 等关键字
  • 输入表达式后服务异常崩溃或超时

✅ 提示

黑盒测试不是瞎试,要懂业务逻辑+关键位置定位+表达式构造

看到规则解析、模板渲染、权限校验时,脑中自动响起:“有没有 SpEL 注入的可能?”

© 版权声明
THE END
喜欢就支持一下吧
点赞9赞赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容