堆叠注入:
原理:利用分号表示一个SQL语句结束,来使用多条SQL语句并行执行。在 SQL 中,分号(;)是用来表示一条 sql 语句的结束。试想一下我们在 ; 结束一个 sql 语句后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。而 union injection (联合注入)也是将两条语句合并在一起,两者之间有什么区别么?区别就在于union 或者 unionall 执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是 任意的语句。
堆叠注入的局限性在于并不是每一个环境下都可以执行,可能受到 API或者数据库引擎 不支持的限制,当然了权限不足也可以解释为什么攻击者无法修改数据或者调用一些程序。
Less-38:
源代码:使用的是mysqli_multi_query()语句。
构造payload进行查询:
此时已经插入新的数据:
此时的源代码中将遍历查询第二结果的语句注释,无法查询第二结果,需要手动修改代码:
当不使用mysqli_mult_query函数时:
order by或者limit后的 injection
首先了解一下order by的用处:对查询结果进行排序。Order by 1,order by 2,order by 3,此类实际上用1,2,3来代替字段值。1表示使用id进行排序,2表示使用username排序,3表示使用password排序。
Less-46:
Right()函数:
首先使用right,left类似函数判断结果:
此时两个函数返回的结果相同,但是两个函数的单个返回值是不同的。
此时尝试使用报错注入或者延时注入。
首先使用order by rand():这个语法应该理解为采用随机排序的方法,输出结果,此时查询的结果是不定随机的。
由上所示,当给rand()函数同一个种子值时,排序的结果都是一样的,那么现在我们可以使用bool型的盲注,传递true和false给rand函数作为种子值,根据不同的排序值就可以判断结果。
传递false:
传递true:
使用报错注入:
报错注入的缺点:错误输出长度存在限制。
procedure analyse 参数后注入
利用 procedure analyse 参数,我们可以执行报错注入。同时,在 procedure analyse 和 orde r by 之间可以存在 limit 参数,我们在实际应用中,往往也可能会存在 limit 后的注入,可以 利用 procedure analyse 进行注入。
Procedure analyse()对表结构进行分析,并且给出建议。
利用orocedure analyse进行报错注入。
在很多情况下会存在limit关键字,这种情况也可以使用procedure analyse进行注入。
进行文件导入导出操作:
使用换行操作写入自定义数据: lines terminated by 0x7e3a
当参数位于limit的时候也可以使用此方法写入文件:
最后是关于limit后参数堆叠注入的,这一块和其他的堆叠注入没有太多的却别。