PHP程序员站--PHP编程开发平台
 当前位置:主页 >> 数据库 >> MsSQL >> 

SQL Server应用程序的高级Sql注入

SQL Server应用程序的高级Sql注入

来源:互联网  作者:  发布时间:2009-04-20
[概 要] 这篇文章讨论常用的sql注入技术的细节,应用于流行的Ms

[更深入的访问]

一旦攻击者可以控制数据库,他们可能想通过这些权限来获得对网络更多的控制,可以通过很多方法来达到这一目的:

1.利用xp_cmdshell扩展存储以SQL-Server用户的身份在数据库服务器上执行命令
2.利用xp_regread扩展存储读取注册表的键值,也包括SAM(只要SQL-Server是以一个本地帐号运行的)
3.用其他的扩展存储改变服务器设置
4.在联合服务器上执行查询
5.创建客户扩展存储从而在SQL-Server进程内运行exploit
6.用'bulk insert'语句去读服务器上任何文件
7.用bcp在服务器上创建任何文本文件
8.用sp_OACreate,sp_OAMethod和sp_OAGetProperty系统存储过程来创建ActiveX对象来完成asp脚本可以做的任何事情

这些只是常见的攻击方法的一部分;攻击者也很可能通过其他方法来达到目的,我们列举这些SQL-Server相关的攻击方法是为了说明如果程序可以被注入SQL语句时可能会发生什么,我们将依次给出以上各种情况的对策。

[xp_cmdshell]

扩展存储的本质是编译了的动态链接库(DLLs),它用SQL-Server指定的调用方式去运行接口函数。他们允许SQL-Server程序拥有了和c/c++一样的功能,是个非常有用的特性。SQL-Server内置了大量的扩展存储,而且有各种各样的函数比如发送邮件和更改注册表。
xp_cmdshell是一个内置的扩展存储,它允许执行任意的命令行程序。例如:

exec master..xp_cmdshell 'dir'

将会获得一个SQL-Server进程所在工作目录的列表

exec master..xp_cmdshell 'net1 user'

将提供主机用户的列表。如果SQL Server正常的以本地'system'帐号或者'domain user'帐号运行,攻击者可以造成更严重破坏。

[xp_regread]

另外一个有用的内置的扩展存储是xp_regXXX函数

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 显示服务器的安全状态信息
xp_makecab 允许用户在服务器上创建压缩文件(或者任何服务器可以访问的文件)
xp_ntsec_enumdomains 列举服务器可以访问的域
xp_terminate_process 结束一个给定PID进程

[联合服务器]

SQL-Server提供了一个服务器联合的机制,就是允许一个数据库服务器上的查询操作其他服务器的数据。这些联合设置存放在master..sysservers表里,如果一个相连的服务器使用了'sp_addlinkedsrvlogin'存储过程,一个自动的登陆了的连接已经存在,可以通过它不登陆而访问该服务器。'openquery'函数允许查询在联合服务器上执行。

[用户自定义扩展存储]

扩展存储的API是相当简单的,创建一个带有恶意代码的扩展存储DLL也是相当容易的。通过命令行有很多方法将DLL上传到服务器,还有其他的很多方法包括各种通信机制来自动实现,比如HTTP下载和FTP脚本。
一旦DLL文件出现在服务器上SQL-Server可以访问,这不一定需要SQL-server本身,攻击者可以通过下面添加扩展存储(这里,我们的恶意扩展存储是个用来操作服务器的文件系统小的木马)

sp_addextendedproc 'xp_webserver', 'c:\temp\xp_foo.dll'

扩展存储就可以通过一般的方法调用:

exec xp_webserver

一旦这个扩展存储执行过,可以这样删除它:

sp_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脚本很有用。


延伸阅读:
PHP+SQL注入式攻击专题连载
一些容易被忽略的SQL注入技巧
SQL注入攻击的种类和防范手段
Mysql手工注入语句(站长推荐)
一个登陆注入小示例
MySQL中SQL的单字节注入与宽字节注入

最新文章
推荐阅读
月点击排行榜
PHP程序员站 Copyright © 2007-2010,PHPERZ.COM All Rights Reserved 粤ICP备07503606号