题目描述本题是一个Flag校验网站用户提交Flag后后端会返回是否正确。题目提供了完整的Express源码。后端使用mysql2库查询SQL数据库查询语句为javascriptlet sql SELECT flag FROM flags WHERE flag ? LIMIT 1; let [rows] await db.query(sql, [flag]);代码正确地使用了预编译语句Prepared Statement来防止SQL注入。此外还有一个nosql中间件对输入进行黑名单过滤拦截了select、union、or、and、--、#、等关键词。同时还有限流中间件防止暴力破解。漏洞分析预编译语句使得SQL注入不可行黑名单过滤也因此显得多余。但题目名为NoSQL暗示漏洞并非SQL注入。关键点在于mysql2库的query方法存在一个隐蔽特性当传入的参数是数组时预编译正常工作但如果传入的参数是对象mysql2会将其键值对解析为SQL的SET子句。javascript// 正常情况参数为数组 db.query(sql, [flag]) // 预编译安全 // 漏洞利用参数为对象 db.query(sql, { flag: ... }) // 被解析为 SET 子句利用过程构造恶意请求将flag参数从字符串改为对象利用mysql2的特性绕过预编译保护。布尔盲注由于有LIMIT 1限制且只能返回布尔结果需要通过布尔盲注逐字符获取Flag。构造类似以下的Payloadjson{ flag: { flag: flag{, : OR flag LIKE flag{% -- } }逐字符提取利用LIKE和通配符逐位爆破Flag的每个字符根据返回的ok: true或ok: false判断字符是否正确。Flagcybertalent{...}具体值根据实际比赛环境而定知识点总结知识点说明预编译语句传统防SQL注入手段但非万能参数绑定绕过mysql2对对象参数的特殊处理布尔盲注无回显情况下逐字符推断数据黑名单的局限关键词过滤无法防御逻辑漏洞核心启示永远不要假设使用了预编译语句就绝对安全参数类型校验同样重要。