Strapi loadsh SSTI RCE(CVE-2023-22621)

admin 2024年2月17日00:55:43评论25 views字数 1508阅读5分1秒阅读模式

环境搭建

要求:此处以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

最终运行图:

Strapi loadsh SSTI RCE(CVE-2023-22621)

漏洞复现

这里以修改注册页面模板并触发渲染RCE为例

Strapi loadsh SSTI RCE(CVE-2023-22621)

Strapi loadsh SSTI RCE(CVE-2023-22621)

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。

漏洞分析

Strapi loadsh SSTI RCE(CVE-2023-22621)

根据请求定位相关路由

Strapi loadsh SSTI RCE(CVE-2023-22621)

Strapi loadsh SSTI RCE(CVE-2023-22621)

Strapi loadsh SSTI RCE(CVE-2023-22621)

其实本漏洞的核心也就在这,也就是绕过此处的isValidEmailTemplate函数校验,该函数代码逻辑如下

Strapi loadsh SSTI RCE(CVE-2023-22621)

在该函数中首先进行格式上的校验,也就是下图这部分,也就是这部分导致我们无法直接使用类似Typora RCE中的child_process#exec来实现RCE。

Strapi loadsh SSTI RCE(CVE-2023-22621)

第二部分是针对于内容的校验,其实相对而言这部分更好绕过。

Strapi loadsh SSTI RCE(CVE-2023-22621)

此处使用正则进行校验,而针对于它的绕过如下

Strapi loadsh SSTI RCE(CVE-2023-22621)

Strapi loadsh SSTI RCE(CVE-2023-22621)

Strapi loadsh SSTI RCE(CVE-2023-22621)

Strapi loadsh SSTI RCE(CVE-2023-22621)

可以看到,我们只要在代码中插入注释夹带这些特点的绕过字符即可是的正则匹配不成立,也就是/**/之间只要存在<%=任一字符即可绕过此处正则匹配。校验通过后会导致模板内容被修改,下一步就是去该模板代码中恶意代码执行进而实现RCE,这里存在两条路可走:

  • 修改重置模板页面去进行密码重置触发template渲染实现JS代码执行。

  • 修改注册模板页面然后注册新用户实现触发渲染执行JS代码RCE。

此处演示使用的是思路2(其实是Github脚本用的这个思路,俺只是该改脚本的菜逼)

Strapi loadsh SSTI RCE(CVE-2023-22621)

根据请求定位对于路由(当然我此处也可以在代码中搜索_.template然后回溯调用构造请求)

Strapi loadsh SSTI RCE(CVE-2023-22621)

Strapi loadsh SSTI RCE(CVE-2023-22621)

Strapi loadsh SSTI RCE(CVE-2023-22621)

Strapi loadsh SSTI RCE(CVE-2023-22621)

修复分析

以这里复现漏洞这个点为例,看看其安全版本的代码逻辑,在整个过程中最核心的点莫过于最后的渲染处(_.template),因为只要此处防御无法绕过,前面即便你修改了模板页面也没法利用,故官方的修复手法就是针对于使用了_.template这些地方进行属性配置来防御代码执行。

Strapi loadsh SSTI RCE(CVE-2023-22621)

Strapi loadsh SSTI RCE(CVE-2023-22621)

结合前面分析图可以发现这里通过配置固定模板代码格式的interpolate属性使得ES6分隔符(${})的内容不会被作为代码执行,默认没配置的interpolate属性会导致${}之间内容被作为代码执行

Strapi loadsh SSTI RCE(CVE-2023-22621)

参考:https://github.com/lodash/lodash/issues/1009

除此之外,此处修复中还配置了evaluate:false,这部分暂未找到官方解释或issue文档之类的,个人感觉应该是关闭代码执行能力。

限制

需要具备后台模板编辑权限的账号或凭据。

总结

前端真恶心,环境更恶心。

原文始发于微信公众号(安全之道):Strapi loadsh SSTI RCE(CVE-2023-22621)

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年2月17日00:55:43
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Strapi loadsh SSTI RCE(CVE-2023-22621)https://cn-sec.com/archives/2214630.html

发表评论

匿名网友 填写信息