我正在使用 ZAP 对 Nextjs 14 Web 应用程序执行扫描,但遇到了此安全问题:
田野 | 详情 |
---|---|
风险级别 | 高 |
漏洞 | SQL 注入 - SQLite |
描述 | SQL 注入是可能的。 |
网址 | https://example.company.com/portal/_next/static/chunks/app/(private)/(with-page-layout)/account/page-716b952001ffc4b9.js |
方法 | 获取 |
参数 | __ID__ |
攻击 | case randomblob(1000000) 当不为空时则 1 else 1 end |
证据 | 使用参数值[case randomblob(1000000) when not null then 1 else 1 end]可以控制查询时间,这导致请求花费[654]毫秒,参数值[case randomblob(10000000) when not null then 1 else ] 1 end ],这导致请求花费了 [851] 毫秒,而原始未修改的查询的值为 [private] 花费了[525] 毫秒。 |
其他信息 | 使用参数值[case randomblob(1000000) when not null then 1 else 1 end]可以控制查询时间,这导致请求花费[654]毫秒,参数值[case randomblob(10000000) when not null then 1 else ] 1 end ],这导致请求花费了 [851] 毫秒,而原始未修改的查询的值为 [private] 花费了[525] 毫秒。 |
实例 | 1 |
解决方案 | 不要信任客户端输入,即使有客户端验证。 一般情况下,类型检查服务器端的所有数据。 如果应用程序使用JDBC,请使用PreparedStatement或CallableStatement,参数通过'?'传递。 如果应用程序使用 ASP,请使用具有强类型检查和参数化查询的 ADO 命令对象。 如果可以使用数据库存储过程,请使用它们。 不要 将字符串连接到存储过程中的查询中,或者使用“exec”、“exec instant”或等效功能! 不要使用简单的字符串连接创建动态 SQL 查询。 转义从客户端收到的所有数据。 在用户输入中应用允许的字符的“允许列表”或不允许的字符的“拒绝列表”。 通过尽可能使用权限最小的数据库用户来应用最小权限原则。 特别要避免使用“sa”或“db-owner”数据库用户。这并不能消除 SQL 注入,但可以最大限度地减少其影响。 授予应用程序所需的最小数据库访问权限。 |
参考 | OWASP SQL 注入预防备忘单 |
CWE ID | |
WASC ID | |
插件 ID |
这个 __ID__ 参数必须由 next.js 生成,可能是动态页面。这是误报吗?有谁遇到过这个安全问题并可以给我解决的提示吗?