【SQL注入06】反证法:判断注入类型是数值型还是字符型

目录

  • 1 背景
  • 2 判断方法
    • 2.1 判断语句与结论
    • 2.2 分析过程
  • 3 引号闭合
  • 4 总结

1 背景

当我们在请求头中传入参数到网站后台,数值型没有被带上引号,字符型则会被带上单引号或双引号,对注入类型进行判断,有利于构造正确有效的注入语句。

2 判断方法

2.1 判断语句与结论

基于以下三个语句,可以判断区分数值型注入与字符型注入,此处先说方法和结论,下文再论述分析过程。

?id=1 and 1=1		//如果页面结果与?id=1一致,则说明是数值型注入
?id=1' and '1'='1	//如果页面结果与?id=1一致,这说明是字符型注入,且语句带入后台后为单引号闭合。
?id=1" and "1"="1	//如果页面结果与?id=1一致,这说明是字符型注入,且语句带入后台后为双引号闭合。

2.2 分析过程

  1. 当参数?id=1带入到后台后成功执行,猜测后台执行语句可能为如下三种:
select * from 表名 where id=1;
select * from 表名 where id='1';
select * from 表名 where id="1";
  1. 当修改参数为?id=1 and 1=1,且页面结果与?id=1一致,则说明该语句带入到后台后成功执行,分三种情况依次用反证法进行分析。
    1. 假设参数为数值型,则该参数带入到后台后语句为select * from 表名 where id=1 and 1=1;where语句后的判断条件为真,对原条件无影响,select语句根据id=1进行数据查询并成功返回数据。
    2. 假设参数为字符型且为单引号闭合,则该参数带入后台后语句为select * from 表名 where id='1 and 1=1';该语句即便能执行其查询对象也与?id=1不一致,与页面返回结果一致的现象相悖,因此不是该类型。
    3. 假设参数为字符型且为双引号闭合,则该参数带入后台后语句为select * from 表名 where id="1 and 1=1";该语句即便能执行其查询对象也与?id=1不一致,与页面返回结果一致的现象相悖,因此不是该类型。
  2. 当修改参数为?id=1' and '1'='1,且页面结果与?id=1一致,则说明该语句带入到后台后成功执行,分三种情况依次用反证法进行分析。
    1. 假设参数为数值型,则该参数带入到后台后语句为select * from 表名 where id=1' and '1'='1;在id=1后为字符串无法正常执行,将报错,与页面返回结果一致的现象相悖,因此不是该类型。
    2. 假设参数为字符型且为单引号闭合,则该参数带入后台后语句为select * from 表名 where id='1' and '1'='1';where语句后的判断条件为真,对原条件无影响,select语句根据id='1’进行数据查询并成功返回数据。
    3. 假设参数为字符型且为双引号闭合,则该参数带入后台后语句为select * from 表名 where id="1' and '1'='1";该语句即便能执行其查询对象也与?id='1'不一致,与页面返回结果一致的现象相悖,因此不是该类型。
  3. 当修改参数为?id=1" and "1"="1,且页面结果与?id=1一致,则说明该语句带入到后台后成功执行,分三种情况依次用反证法进行分析。
    1. 假设参数为数值型,则该参数带入到后台后语句为select * from 表名 where id=1" and "1"="1;在id=1后为字符串无法正常执行,将报错,与页面返回结果一致的现象相悖,因此不是该类型。
    2. 假设参数为字符型且为单引号闭合,则该参数带入后台后语句为select * from 表名 where id='1" and "1"="1';因为单引号不能括住双引号,因此在id='1处将报错,与页面返回结果一致的现象相悖,因此不是该类型。
    3. 假设参数为字符型且为双引号闭合,则该参数带入后台后语句为select * from 表名 where id="1" and "1"="1";where语句后的判断条件为真,对原条件无影响,select语句根据id='1’进行数据查询并成功返回数据。

3 引号闭合

对于字符型注入,该语句带入到SQL语句中常带有引号,想要语句能够正常执行,就需要在构造合适的语句与前后的引号成功闭合。

  1. 像上述分析过程中那样,在语句中添加偶数个引号使得语句中该为字符的地方能成功闭合。
  2. 当我们不想后台语句最后一个引号时,可以在构造参数时结尾处,让该逗号注释掉。这里在不同的注入位置根据SQL注释语句有不同用法。
    1. 在url中注入时。语句最后添加“–+”三个字符将其后的引号注释掉,在url中+号表示空格。例如:在字符型注入时,修改参数为?id=1' union select 1,2--+,该参数带入到SQL后台时语句为select * from 表名 where id='1' union select 1,2--+';语句结尾成功将最后一个'注释掉,让前面的语句能成功执行。
    2. 在cookie中注入时。语句最后添加#号。

4 总结

  1. 掌握判断字符型注入与数值型注入的方法;
  2. 理解反证法思路;
  3. 掌握引号闭合的构造方法。

你可能感兴趣的:(#,筑基07:WEB漏洞原理,sql,数据库,database)