二次注入在测试的时候比较少见,或者说很难被测出来,因为测的时候首先要去找注入的位置,其次是去判断第一次执行的SQL语句,然后还要去判断第二次进行调用的 SQL 语句。而关键问题就出在第二次的调用上面。
下面以一个常用过滤方法来说明具体问题。
通过addslashes函数的转换可以将查询语句中的单引号进行转义,避免了在查询中出现 SQL 注入的问题。那我们接下来换一个语句,看一下会出现什么效果。
能够发现我们插入语句中的单引号在执行SQL语句的时候是被转义了的,而在数据库中这个单引号却还是被直接存放在数据库没有添加我们的转义符。
这也是addslashes函数的一个特点,只负责在查询之前进行转义危险字符,但不会修改原始数据。那么当被插入的危险数据又被调用成查询条件呢?这个时候就变成二次注入了。
其中 addslashes 函数中的数据是用户插入的数据,先不谈这个程序的逻辑有点愚蠢,因为只是为了演示,现实中的程序会将第一次的查询结果用来操作另外的数据表或者进行删改操作。
可以看到最终执行的语句就一个盲注的语法。