PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Démontrer l'injection SQL en PL/pgSQL

Les requêtes SQL en PL/pgSQL sont planifiées comme des instructions préparées. Tant que vous ne transmettez que des valeurs comme vous le faites, l'injection SQL est généralement impossible . Détails :

Utiliser SQL dynamique avec EXECUTE et sans gestion appropriée des paramètres pour réellement démontrer l'injection SQL.

Comme (c'est comme ça pas pour le faire !) :

CREATE OR REPLACE FUNCTION login_v(em varchar, passwd varchar)
  RETURNS SETOF users AS
$func$
BEGIN
   RETURN QUERY EXECUTE
        'SELECT *
         FROM   users
         WHERE  email = $1
         AND    encrypted_password = crypt(''' || passwd || ''', encrypted_password)'
   USING em;
END
$func$  LANGUAGE plpgsql;

La première variable em est correctement passé avec le USING clause comme valeur et ne peut donc pas être abusé pour l'injection SQL.

Mais la deuxième variable passwd est incorrectement concaténé sans s'échapper correctement. Ainsi, l'entrée de l'utilisateur peut être convertie en code SQL. Injection SQL.

Ne l'utilisez jamais ! Sauf en démontrant comment ne pas le faire.

Un méfait similaire est possible lors de la concaténation incorrecte de chaînes SQL dans le client.