环境搭建
要求:此处以4.5.5版本搭建为例,故需要nodejs18.x版本,npm版本为6.x,别问为什么?问就是踩坑踩出来的。默认nodejs18.x版本带的npm是9.x版本,需要自己降级(参考:https://www.python100.com/html/7BLP3G013JE5.html)
sharp安装失败解决方法:https://cloud.tencent.com/developer/article/2041832?areaSource=102001.3&traceId=uKbAXj1rx0L0UZ9b4xGNf
安装教程:https://blog.csdn.net/qq_34936893/article/details/128827465
最终运行图:
漏洞复现
这里以修改注册页面模板并触发渲染RCE为例
POC
<%= `${ process.binding("spawn_sync").spawn({"file":"C:\Windows\System32\cmd.exe","args":["/c","calc"],"stdio":[{"readable":1,"writable":1,"type":"pipe"},{"readable":1,"writable":1,"type":"pipe"/*<>%=*/}]}).output }` %>
此处为Windows POC。
漏洞分析
根据请求定位相关路由
其实本漏洞的核心也就在这,也就是绕过此处的isValidEmailTemplate
函数校验,该函数代码逻辑如下
在该函数中首先进行格式上的校验,也就是下图这部分,也就是这部分导致我们无法直接使用类似Typora RCE中的child_process#exec
来实现RCE。
第二部分是针对于内容的校验,其实相对而言这部分更好绕过。
此处使用正则进行校验,而针对于它的绕过如下
可以看到,我们只要在代码中插入注释夹带这些特点的绕过字符即可是的正则匹配不成立,也就是/**/之间只要存在<、%、=任一字符即可绕过此处正则匹配。校验通过后会导致模板内容被修改,下一步就是去该模板代码中恶意代码执行进而实现RCE,这里存在两条路可走:
-
修改重置模板页面去进行密码重置触发template渲染实现JS代码执行。
-
修改注册模板页面然后注册新用户实现触发渲染执行JS代码RCE。
此处演示使用的是思路2(其实是Github脚本用的这个思路,俺只是该改脚本的菜逼)
根据请求定位对于路由(当然我此处也可以在代码中搜索_.template然后回溯调用构造请求)
修复分析
以这里复现漏洞这个点为例,看看其安全版本的代码逻辑,在整个过程中最核心的点莫过于最后的渲染处(_.template),因为只要此处防御无法绕过,前面即便你修改了模板页面也没法利用,故官方的修复手法就是针对于使用了_.template
这些地方进行属性配置来防御代码执行。
结合前面分析图可以发现这里通过配置固定模板代码格式的interpolate
属性使得ES6分隔符(${})的内容不会被作为代码执行,默认没配置的interpolate
属性会导致${}之间内容被作为代码执行
参考:https://github.com/lodash/lodash/issues/1009
除此之外,此处修复中还配置了evaluate:false
,这部分暂未找到官方解释或issue文档之类的,个人感觉应该是关闭代码执行能力。
限制
需要具备后台模板编辑权限的账号或凭据。
总结
前端真恶心,环境更恶心。
原文始发于微信公众号(安全之道):Strapi loadsh SSTI RCE(CVE-2023-22621)
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论