Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 在PL/pgSQL中演示SQL注入_Postgresql_Sql Injection_Plpgsql_Dynamic Sql - Fatal编程技术网

Postgresql 在PL/pgSQL中演示SQL注入

Postgresql 在PL/pgSQL中演示SQL注入,postgresql,sql-injection,plpgsql,dynamic-sql,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); re

我在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;
当我提供这样的输入时:
选择login\u v('test@test.com“或1=1;”--“啦啦啦”
,我认为我的方法应该返回用户电子邮件
test@test.com
。我做错了什么


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

PL/pgSQL中的SQL查询就像预先准备好的语句一样进行规划。只要像您一样只传递,SQL注入通常是不可能的。详情:

将动态SQL与
EXECUTE
一起使用,但不进行适当的参数处理,以实际演示SQL注入

比如(这是做的方式!):

第一个变量
em
一起使用
子句作为正确传递,因此不能用于SQL注入

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

千万不要用这个演示如何不这样做时除外

当在客户端中不正确地连接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;