Prisma Client est paramétré par défaut. Les méthodes de requête typées (findMany, update, et les autres) se compilent en SQL lié, et l'API brute à template taggé ($queryRaw et $executeRaw) paramètre ses interpolations. L'injection apparaît à deux endroits précis : les méthodes brutes explicites Unsafe, qui prennent une chaîne simple, et les arguments where/filtre construits à partir d'un objet non fiable.
Où ça dérape#
- Injection de requête brute :
$queryRawUnsafeet$executeRawUnsafeacceptent une chaîne, donc l'entrée concaténée dedans injecte du SQL. Le$queryRawsûr à template taggé ne demande qu'une courte modification, et mélanger les deux est l'erreur. - Injection de filtre : étaler un objet de requête dans un
wherelaisse l'appelant fournir des opérateurs Prisma et des filtres de relation, changeant les lignes qui correspondent au-delà de ce que l'endpoint prévoyait.
Les chemins sûrs et non sûrs côte à côte#
Prisma rend la frontière exceptionnellement visible : les méthodes dangereuses portent Unsafe dans leur nom. $queryRaw\...`lie chaque${};$queryRawUnsafe(str)exécutestrtel quel. Le cas plus subtil est l'API typée elle-même, qui est sûre côté injection pour les valeurs mais fait confiance à la forme de l'objetwhere`, donc un endpoint qui y transmet du JSON de l'attaquant remet à l'appelant le contrôle de la structure de la requête plutôt que seulement une valeur.
Outils#
- sqlmap : exploiter les points d'injection $queryRawUnsafe et $executeRawUnsafe.
- Burp Repeater : tester les méthodes brutes et les objets non fiables étalés dans where.