WordPress插件Chained Quiz 1.3.5未授权IDOR漏洞分析与利用

本文详细分析了WordPress插件Chained Quiz 1.3.5版本中存在的未授权不安全的直接对象引用漏洞。攻击者可通过篡改Cookie中的可预测`completion_id`,无需认证即可劫持或篡改其他用户的测验提交与分数。

漏洞标题: 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: 不恰当的授权
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计