漏洞概述 该漏洞涉及Shopware平台中的授权绕过和折扣竞态条件问题。具体包括: 1. 授权绕过: - 多个Filament操作(如取消、开始处理、标记已支付、标记完成、捕获支付、存档、标记已交付、编辑)现在需要 权限。 - 之前 / 权限足以修改订单、更改支付状态并触发真实的PSP网关。 - 产品表单子组件(编辑、库存、SEO、运输、文件)现在通过Livewire wire事件直接调用,而不是通过父页面的 守卫。 - 订单笔记 在没有 和 的情况下,任何授权用户都可以修改订单笔记和免费订单添加。 - 设置/团队索引页面没有 , 和 在用户上可调用,没有查看用户权限。现在两个都通过访问设置进行保护。 - 角色权限 、 和 在只读用户权限上被保护。只有拥有此权限的用户才能创建新权限并将其分配给角色,从而提升其自身权限。现在已移至访问设置。 - 支付方式/货币/承运人 、 、 和批量操作没有权限保护。现在已强制执行访问设置。 - 库存表单/策略表单(设置子组件):相同的直接调用绕过在 上。已修复。 - 客户创建/存储:重新检查 防御性地切换从 到显式 允许列表,移除 隐藏字段注入路径。 - 权限 / :由于 查找返回空数组(并发删除),导致致命错误。现在已早期返回。 - 模式统一:所有Filament操作处理程序从 内部闭包移动到 链式调用。现在在UI中隐藏禁止操作,而不是在点击时抛出。 2. Livewire [#Locked] 加固: - 所有公共Eloquent模型属性在Livewire组件中现在被 ,以防止客户端ID篡改。 - 覆盖模型: 、 、 、 、 、 、 、 、 、 。 3. 条形码XSS: - 管理员渲染 通过 与 。产品条形码文本输入( 、 、 、 )现在约束输入为 ,关闭存储的XSS表面。 4. 折扣竞态条件 + 每用户限制 (#510): - 之前创建了 ,然后尝试条件插入 。在条件检查后, 匹配零行,一旦达到限制,但订单已经提交,折扣应用后, 在 时阻塞。 - 修复: - 引入 ,它在现有的 内部运行,获取行级 ,并执行原子比较和交换在 上。如果 ,抛出 并回滚事务。没有订单被提交。 - 之前读取 ,计数器没有代码路径 ever 递增。现在查询 并抛出 在第二次赎回时。无论资格模式如何,都有效。 - 更新为使用相同的订单基础检查,拒绝在购物车应用时而不是在结账时作为惊喜。 影响范围 授权绕过:影响多个Filament操作和Livewire组件,可能导致未授权用户执行敏感操作。 Livewire加固:影响所有公共Eloquent模型属性,防止客户端ID篡改。 条形码XSS:影响产品条形码文本输入,可能导致存储的XSS攻击。 折扣竞态条件:影响折扣应用逻辑,可能导致超额折扣或竞态条件问题。 修复方案 1. 授权绕过: - 添加必要的权限检查,确保只有授权用户才能执行敏感操作。 - 使用 属性保护Livewire组件中的公共Eloquent模型属性。 2. Livewire加固: - 对所有公共Eloquent模型属性添加 属性,防止客户端ID篡改。 3. 条形码XSS: - 约束产品条形码文本输入,使用正则表达式 ,关闭存储的XSS表面。 4. 折扣竞态条件: - 引入 方法,使用行级锁和原子比较交换,确保折扣应用的原子性。 - 更新 ,使用订单基础检查,确保拒绝在购物车应用时而不是在结账时作为惊喜。 POC代码 以上代码块展示了部分修复方案的具体实现。