前言
参考:
https://tttang.com/archive/1547
https://blog.csdn.net/HatOfDragon/article/details/54601121
https://www.cnblogs.com/yilishazi/p/14710349.html
信息收集
-- 详细信息
select version();
-- 版本信息
show server_version;
select pg_read_file('PG_VERSION', 0, 200);
-- 数字版本信息包括小版号
SHOW server_version_num;
SELECT current_setting('server_version_num');
列目录
-- 注意: 在早期的 PostgreSQL 版本中,pg_ls_dir 不允许使用绝对路径
select pg_ls_dir('/etc');
-- 获取 pgsql 安装目录
select setting from pg_settings where name = 'data_directory';
-- 查找 pgsql 配置文件路径
select setting from pg_settings where name='config_file'
列数据库
SELECT datname FROM pg_database;
查看支持的语言
select * from pg_language;
查看安装的扩展
select * from pg_available_extensions;
查看服务器 ip 地址
select inet_server_addr()
账户操作
查看当前用户是不是管理员权限
SELECT current_setting('is_superuser');
-- on 代表是, off 代表不是
SHOW is_superuser;
SELECT usesuper FROM pg_user WHERE usename = CURRENT_USER;
查询密码
SELECT usename, passwd FROM pg_shadow;
SELECT rolname,rolpassword FROM pg_authid;
-- 当前加密方式,password_encryption参数决定了密码怎么被hash
SELECT name,setting,source,enumvals FROM pg_settings WHERE name = 'password_encryption';
注入
注释符 --,/**/(注意 postgres 的这个注释符需要成对)
关于转义
postgresql 9 之前,反斜杠转义
postgresql 9 之后,反斜杠已经变成了普通字符,如果需要使用反斜杠转义可以在需要转义的字符串前面加上E(E就是Escape):
SELECT * FROM user WHERE username LIKE E'%\t%';
postgresql 中字符串需要用单引号包裹,如果使用双引号,系统将认为那是变量
所以最常见的转义就是对单引号的转义,postgresql 对单引号的转义有两种方式:
UPDATE user SET username = 'Peter''s Name' WHERE id = 1;
UPDATE user SET username = E'Peter\s Name' WHERE id = 1;
盲注
延时函数
select pg_sleep(5)
if 判断:
select case when (1>0) then 1 else 0 end