文章插图
strVal的值变为timestamp,所以在indexOf判断时,由于没出现${,所以变为了-1,跳过了while循环,直接执行下边的return result.toString();
。
继续跟进,下一步是调用resolvePlaceholder方法,此函数的作用是查找this.context中对应参数的值并返回,如下图:
文章插图
发现拿到了时间戳"timestamp" -> "Wed Oct 19 00:38:36 CST 2022",然后赋值给propVal,此时不为空,进入下一个if循环,再次调用parseStringValue 。
文章插图
接着进行replace替换,将原来的
${timestamp}
处的值替换成了 Wed Oct 19 00:38:36 CST 2022
,最后return result.toString();
返回,如下图:文章插图
然后寻找template中的下一个参数位,这次的参数是error,流程与上面基本一样,这里不再细致分析 。
文章插图
接着第三个参数是status,同理
文章插图
最后是第四个参数
message
,重点来了,这个值是用户输入的 。接着分析,跟进parseStringValue
方法文章插图
拿到message对应的值,也就是用户输入的payload
文章插图
赋值给propVal,接着调用parseStringValue
文章插图
这次调用去除了
${}
文章插图
最后进入
resolvePlaceholder
,成功执行T(java.lang.Runtime).getRuntime().exec(new String(new byte[]{0x63,0x61,0x6c,0x63}))
,弹出计算器,分析结束 。文章插图
参考文章https://www.cnblogs.com/litlife/p/10183137.html
https://www.cnblogs.com/zpchcbd/p/15536569.html
https://blog.csdn.net/haduwi/article/details/126326511
https://blog.csdn.net/weixin_54902210/article/details/124533353
经验总结扩展阅读
- 手写自定义springboot-starter,感受框架的魅力和原理
- 一 JPA入门学习集合springboot
- 关于Springboot启动报错 Whitelabel Error Page: This application has no explicit mapping
- 七 SpringBoot - Redis 缓存
- 一篇文章带你了解网页框架——Vue简单入门
- 五 SpringBoot - Java8 新特性
- 四 SpringBoot - 整合Mybatis,逆向工程,JPA
- 一篇文章带你掌握MyBatis简化框架——MyBatisPlus
- 一篇文章带你掌握主流办公框架——SpringBoot
- Taurus.MVC 微服务框架 入门开发教程:项目部署:7、微服务节点的监控与告警。