四种注入方式的参数区别

sechub官方2023-06-16文章来源:SecHub网络安全社区


一、联合查询参数

只有联合查询需要参数为不存在的值(如负数、0或极大的整数)。

由于UNION的作用是将两个及两个以上select查询结果合并,所以UNION必须由两条或两条以上的SELECT语句组成,语句之间用关键字UNION分隔

合并后开发者预设的原有SQL语句的查询结果占据结果集第一行,攻击者插入的恶意SQL语句查询结果占据后面的第二行、第三行…

而数据库程序在向前端输出查询结果时有个默认规则,默认只输出结果集中第一行的结果,所以攻击者需要让原本在结果集中第一行的开发者预设的原有SQL语句查询结果为空,让攻击者插入的恶意SQL语句的查询结果得以占据结果集第一行,从而被数据库程序输出到前端,从而能从网页上的显示位中看到恶意SQL语句查询结果。

负数和0也是整型数字,也在规则允许之内,但不是被常规使用的数字,就导致我们将参数值改为负数或0不会违反规则导致语法错误,但数据库中没有如id=-1的值,该值是一个不存在的值,所以查询不到结果,导致查询结果为空。

简而言之,攻击者目的是让原有SQL语句查询结果为空,将参数值设置为如99999999这样特别大的整数也可以达到相同效果。

二、报错注入参数

报错注入参数存在与否都可以。

报错注入主要是针对语法错误的控制,攻击者插入的恶意SQL语句的查询结果会在报错信息中一同显示出来,而不是在显示位中进行显示,所以原有SQL语句查询结果是否为空对报错注入结果的显示无影响。

三、布尔盲注参数

布尔盲注参数不能为不存在的值。

不能让开发者预设的SQL语句执行结果为空,因为布尔盲注判断语句执行成功与否、就是通过页面的返回状态、来判断攻击者插入的恶意SQL语句是否执行成功。如果为异常值,那插入的语句不论执行成功或执行失败,页面都会返回异常,就失去了注入判断条件

四、时间盲注参数

时间盲注参数不能为不存在的值。

因为如果查询结果为空,sleep()函数不会被执行,就会导致正确错误返回时间都一样,也就无法判断攻击者插入的恶意SQL语句是否被执行。