知识点:
- 利用回显信息不同进行盲注爆破出敏感信息
- 两种绕过方法
- 单引号闭合绕过;不加注释符
- id =1' and 1='1
- 完全闭合原始语句的绕过;这题是采用了where id=(('输入'))
- id =1')) and 1=1 --+
- 单引号闭合绕过;不加注释符
首先判断注入类型
构造id=1/0
正常回显,字符型注入
构造id=1'
出现错误了,说明单引号读取输入
构造id=1’‘
输出正常的语句;此时确认了这里是单引号引起的sql注入
构造id=1'+and+1=1
发现返回错误,说明语句不对
再尝试构造id=1’+and+1='1
正常回显,说明是简单的单引号绕过(这里猜错了,不只是单引号绕过,但是刚好可以用)
构造id=1’+and+1='1 --+
这里发现也能正常回显;这就纳闷了??如果是简单的单引号绕过的话,注释符应该把后面的那个引号进行注释了,那么and后面的引号应该会因为引号不闭合进行报错,但是这里正常显示了,这里就搞不懂了;但是不影响使用,既然这能解析,那就在构造一个测试一下
构造id=1’ and 'a'='a --+
出现了错误,说明还是有问题,但是不知道原始语句是什么样的
尝试把最后的注释符去掉,构造id=1' and 'a'='a
发现成功回显;说明这里可以通过单引号闭合的方式绕过,但是原始语句肯定不是只加了单引号进行读取输入数据
通过构造id=1' and database()='security(这步没截图,简单测了一下)
成功输出了正确内容;说明这里可以使用单引号闭合绕过并读取关键信息
由于没有有价值的回显信息,而且所有错误同一输出固定的语句,导致无法使用错误注入;
只能利用回显信息的不同进行bp爆破了,逐位爆破出对应的表名;利用bp抓包放到爆破模块
这里构造的payload:id=1%27+and+mid((select%20group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=%27security%27),§1§,1)='§101§
对截取函数的起始位和后面的判断字符位进行标记;选择集束炸弹的方式进行爆破;
设置payload1为数字类型(numbers),步长为1,起始为1,终止为50,50位应该够了
设置payload2为字符组合类型(brute forcer),设置最小长度和最大长度都为1,因为他会把指定区间的长度都进行枚举,这里只需要进行字符爆破,所以设定长度为1,这样就是枚举每个字符和数字了
开始爆破,得出结果后进行过滤;因为错误和正确的输出长度是一样的,所以没办法利用长度进行辨别,点击上面的过滤条件,将正确的输出内容复制到过滤条件中,点击应用
出现了正确的内容,点击payload1进行排序,得到了所有的表明字符串;可以看到中间是由断号的,那个就是分隔符;按顺序从上往下依次读取表名信息,根据断号进行区分
到这里就算是完了,这关就是通了;但是到这里我还是没搞懂原始的查询语句到底是什么样的;之后看了一下别人的wp才发现,这里是采用了两层小括号进行读取的;即where id=(('输入'))
所以还有第二种方法进行绕过:构造payload:id=1')) and 1=1 --+
之后就跟我上面的方法一样,利用bp爆破出相关的敏感信息
10