针对 CVE-2026-22014 的概念验证漏洞利用,演示如何操纵 GraphQL API 中的持久化查询 ID,以绕过白名单并执行任意查询。
// graphql_persisted.js - Accepts persisted query IDs
const express = require('express');
const { graphqlHTTP } = require('express-graphql');
const queries = {
"abc": "query { user { name } }"
};
app.post('/graphql', graphqlHTTP({
schema: schema,
customExecuteFn: (args) => {
const doc = parse(queries[args.queryId] || args.query);
return execute(args);
}
}));
GraphQL 服务器支持持久化查询,但当 queryId 未知时,会回退到客户端提供的 query 参数。攻击者可以提供一个不存在的 ,并附带任意 GraphQL 查询,从而绕过预期的持久化查询白名单。
queryIdqueryId 时,解析器信任客户端提供的 query,而不是拒绝该请求。启动服务器并发送混合载荷:
python exploit_persisted_query.py
服务器将执行恶意查询。