在 PL/pgSQL 中演示 SQL 注入

Demonstrate SQL injection in PL/pgSQL

我在 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');,我认为我的方法应该 return 用户的电子邮件 test@test.com。我做错了什么?

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

SQL PL/pgSQL 中的查询被计划为准备好的语句。只要像你一样只传values,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 = 
         AND    encrypted_password = crypt(''' || passwd || ''', encrypted_password)'
   USING em;
END
$func$  LANGUAGE plpgsql;

第一个变量 em 通过 USING 子句作为 value 正确传递,因此不能滥用 SQL 注射。

但是第二个变量 passwd 没有正确转义就没有正确连接。因此,用户输入可以转换为 SQL 代码。 SQL注入。

永远不要使用这个!除非在演示如何不这样做。

在客户端中不正确地连接 SQL 字符串时,可能会出现类似的问题。