在 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 字符串时,可能会出现类似的问题。
我在 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 字符串时,可能会出现类似的问题。