在PL / pgSQL中演示SQL注入

时间:2017-01-16 22:59:05

标签: postgresql sql-injection plpgsql dynamic-sql

我在plpgsql中有这个功能:

CREATE OR REPLACE function login_v(em varchar, passwd varchar)
  RETURNS users AS $$
DECLARE
   cu users;
BEGIN
   SELECT * into cu
   FROM users where email = em 
   AND encrypted_password = crypt(passwd, encrypted_password);

   return cu;
END
$$ LANGUAGE plpgsql;

当我提供这样的输入:select login_v('test@test.com'' OR 1=1;--','la la la');时,我认为我的方法应该向用户发送电子邮件test@test.com。我做错了什么?

这里需要执行SQL注入来演示练习的概念,但我是一个SQL注入和plpgsql boob。 :|

1 个答案:

答案 0 :(得分:4)

PL / pgSQL中的SQL查询计划类似于预处理语句。只要您像传入 一样,SQL注入通常 不可能 。详细说明:

将动态SQL与EXECUTE一起使用,并且没有正确的参数处理来实际演示SQL注入。

喜欢(这是 的方式!):

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;

第一个变量emUSING子句一起正确传递为 ,因此不能滥用SQL注入。

但第二个变量passwd在没有正确转义的情况下连接不正确。因此,用户输入可以转换为SQL代码。 SQL注入。

永远不要使用此功能!除非在演示如何不这样做时使用。

在客户端不正确地连接SQL字符串时,可能会发生类似的恶作剧。