PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Demonstrar injeção de SQL em PL/pgSQL


As consultas SQL em PL/pgSQL são planejadas como instruções preparadas. Desde que você passe apenas valores como você, injeção de SQL geralmente é impossível . Detalhes:

Use SQL dinâmico com EXECUTE e sem manipulação de parâmetros adequada para realmente demonstrar injeção de SQL.

Curtir (é assim que não fazer isso!):
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;

A primeira variável em é passado corretamente com o USING cláusula como valor e, portanto, não pode ser abusado para injeção de SQL.

Mas a segunda variável passwd é concatenado incorretamente sem escapar adequadamente. Assim, a entrada do usuário pode ser convertida em código SQL. Injeção SQL.

Nunca use isso! Exceto quando demonstrando como não fazê-lo.

Um dano semelhante é possível ao concatenar strings SQL no cliente incorretamente.