sql >> Base de Datos >  >> RDS >> PostgreSQL

Demostrar inyección de SQL en PL/pgSQL

Las consultas SQL en PL/pgSQL se planifican como declaraciones preparadas. Siempre y cuando solo pases valores como tú, la inyección SQL es generalmente imposible . Detalles:

Usa SQL dinámico con EXECUTE y sin el manejo adecuado de parámetros para demostrar realmente la inyección de SQL.

Me gusta (así es como no hacerlo!):

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 primera variable em se pasa correctamente con USING cláusula como valor y por lo tanto no se puede abusar de la inyección de SQL.

Pero la segunda variable passwd se concatena incorrectamente sin escapar correctamente. Por lo tanto, la entrada del usuario se puede convertir en código SQL. Inyección SQL.

¡Nunca uses esto! Excepto cuando se demuestra cómo no hacerlo.

Es posible que se produzcan daños similares cuando se concatenan incorrectamente cadenas SQL en el cliente.