Postgresql 在PL/pgSQL中演示SQL注入
我在plpgsql中有这个函数: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
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注入通常是不可能的。详情:
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;