PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Demonstrieren Sie die SQL-Injection in PL/pgSQL

SQL-Abfragen in PL/pgSQL werden wie vorbereitete Anweisungen geplant. Solange Sie nur Werte übergeben wie Sie es tun, ist die SQL-Einschleusung im Allgemeinen unmöglich . Einzelheiten:

Verwenden Sie dynamisches SQL mit EXECUTE und ohne richtige Parameterbehandlung, um die SQL-Einschleusung tatsächlich zu demonstrieren.

Wie (so nicht tun!):

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;

Die erste Variable em wird korrekt mit dem USING übergeben -Klausel als Wert und kann daher nicht für SQL-Injection missbraucht werden.

Aber die zweite Variable passwd ist unsachgemäß verkettet, ohne ordnungsgemäß zu maskieren. Somit können Benutzereingaben in SQL-Code umgewandelt werden. SQL-Injection.

Nie verwenden! Außer wenn man demonstriert, wie man es nicht macht.

Ähnliches Unheil ist möglich, wenn SQL-Strings im Client unsachgemäß verkettet werden.