文/xuser

一般注入多用于在mssql和mysql两类数据库中,如mssql+asp、 mysql+php则是最为常见的搭配环境。不同的网站应用的数据库也大不一样,根据数据库的处理能力、负载等多重因素决定。诸如mssql与mysql 各类注入问题在网上已是随处可见,本文主要述说下关于少见的一类数据库注入:PostgreSQL。

关于PostgreSQL
PostgreSQL是一种特性非常齐全的自由软件的对象-关系型数据库管理系统(ORDBMS),可以说是目前世界上最先进,功能最强大的自由数据库管理系统。

了解PostgreSQL
1.同其他数据库一致,SQL语句基本一致
2.支持/*、/**/、–注释,;和\g表示语句结束
3.使用||可以连接字符串(类似于mssql中的+),同时需要注意特殊字符被转义
4.无法自动匹配字段
5.web管理程序为phpPgAdmin
6.开放的默认端口为5432

注入PostgreSQL

1.内置函数
通过一些内置函数我们可以获取到很多关于数据库的信息,简单列举下比较有价值的函数:
current_database() //当前数据库名
session_user //会话用户
current_user //当前数据库用户

2.如何读取表与字段、内容
一般我们都先回手工猜测数据库中的表和字段,但如果猜测不到也没有关系,这并不是access 数据库,可以通过一些数据库本身存在的表与字段读取所有表和字段,如mysql中会表所有表和字段放入一个预定的库中。在PostgreSQL在让我们读 取这些信息也提供了方便,数据库可以通过pg_stat_user_tables来依次读取,另外information_schema.columns 也给我们一样提供了方便,让我们可以读取数据库表和字段,其次还有pg_user、pg_group、pg_shadow都能返回给我们很多有用的信息, 记得oid也能让我们获取到这些信息,不过记不太清楚了,如此多的途径相信在获取表或字段这些你都不会有问题了。读取内容的时候我们也同样可以根据ID来 依次数据。我曾经遇见过一个PostgreSQL+php网站,由于magic_quotes_gpc=on的问题,又找不到id类的标识可以让我去读取 表中其他内容,这个时候除此之外通过limit n offse n读取到了表中所有内容,其实它真的很不错。

3.读、写文件
通过数据库写文件来获取webshell是最为直接的方式了,不需要找后台,也不需要找上传漏洞,甚至我们可以通过数据库来直接获取到服务器的hash值进行破解,简直给我们带来了太多的方便。如何写文件呢?

create table file(shell text not null); //创建表和字段
insert into file values(‘’); //写入代码到数据库
copy file(shell) to ‘/var/www/html/shell.php’; //导出文件
通过上面三个语句我们就可以轻松的获取到一句话,执行这些我想不是一问题,通过;或构造其他语句都可以实现,最后记得删除执行drop table file来删除痕迹。一篇文中曾提到过更简单的方法
copy (select ‘’) to ‘/var/www/html/shell.php’

一句话就直接搞定,不过未曾测试这句话的可行性。在没有写入文件权限的时候可以尝试下读取文件,看看如何构造读取文件的语句吧?
create table file(file text not null); //创建表和字段
copy file (file) from ‘/etc/passwd’; //复制文件内容到字段中
select * from file; //查询
也可以通过这个来读取网站配置文件来获取数据库呢,真的很方便。另外PostgreSQL新版本中也提供了很多的函数, 如:pg_read_file(‘/etc/passwd’,1,20)可以直接读取文件内容,类似于此函数还 有:pg_file_write(filename,text,bool)、pg_read_file(filename,pos,length)、 pg_ls_dir(dirname)等,不过这些函数常被管理员因为安全考虑而删除,这就看运气了。

4.如何绕过”\”转义(引号)
如果PHP中开启了magic_quotes_gpc=on,那么很悲剧的是一些符号将会被转义,如执行select pass from member where name=”admin”,最后的语句执行时为:select pass from member where name=\”admin\”,这样就无法达到我们想要的结构了。其他数据库我们尝是通过hex、char编码来解决这个问题,而在PostgreSQL 中除此也给我们提供了一种新的方法来绕过。在语句中,允许我们通过$和$之间来绕过引号的转义或者过滤问题,可以改写成这样:select pass from member where name=$admin$,如此就成功的绕过了引号