PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Dimostrare SQL injection in PL/pgSQL

Le query SQL in PL/pgSQL sono pianificate come istruzioni preparate. A patto di trasmettere solo valori come te, l'iniezione SQL è generalmente impossibile . Dettagli:

Usa SQL dinamico con EXECUTE e senza un'adeguata gestione dei parametri per dimostrare effettivamente l'iniezione di SQL.

Mi piace (è così che non). per farlo!):

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 prima variabile em è correttamente passato con il USING clausola come valore e quindi non può essere abusato per SQL injection.

Ma la seconda variabile passwd è concatenato in modo improprio senza scappare correttamente. Pertanto, l'input dell'utente può essere convertito in codice SQL. Iniezione SQL.

Non usarlo mai! Tranne quando si dimostra come non farlo.

Un simile danno è possibile quando si concatenano stringhe SQL nel client in modo improprio.