堆叠注入学习

时间:2022-07-23
本文章向大家介绍堆叠注入学习,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

类似前言一样没用的话

这玩意用来记录一下我前天大晚上不睡觉理解的一个题目,没啥意思,没多少基础的东西,勿看

概念

众所周知在数据库语句中是通过 ;来判断一个语句有没有结束的,堆叠注入的意思就是,一条里面有多个sql语句,例如

看起来和 union的形式差不多,但是还是8一样的, union执行的的语句类型是有限的,一般来说只用于查询语句,而堆叠注入能做到执行任意语句,只要数据库支持

演示

前天在某一处看到一道题

[SUCTF2019]EasySQLbuuoj

这道题的考点是源码泄露,接着sql注入

这是查询部分的语句 select$_POST[query]||flagfromflag

其中的可控点为 $_POST[query],发送post数据后,会拼合sql语句,于是在实验的时候,发现了一个问题

可以看到我第一条语句中,不论怎么样结果都是1,于是去google了一下

发现 ||被mysql当成 or来处理了,在查询的结果中,只要有一个是有结果的,那么这条语句的结果都是 True也就是 1,这带来的一个问题就是根本知道查询出来的结果是什么

在别的数据库中, ||是做连接符来处理的(这里懒得开别的数据库了)

那么遇到了 select$_POST[query]||flagfromflag这种语句就应该使用堆叠注入,注入一个set的语句,将mysql中的配置改了,这样一来,他就会将 ||做连接符处理

语句:select $_POST[query] || flag from flag
         select <这里是可控部分> || flag from flag
    #输入 elapse
    语句:select elapse || flag from flag
    #构造堆叠注入  "1;set sql_mode=PIPES_AS_CONCAT;select 1"
    语句:select 1;set sql_mode=PIPES_AS_CONCAT;select 1 || flag from flag;

这时候,这条语句就执行了三次,第一次查询了1,没作用,第二次就修改了数据库的设置,将 ||作为连接符号来用,而不是 or,第三次就是构造出来防止语句报错的

这时你在去正常的查询,flag就拼接在其中了,因为没环境所以这里的flag是我乱敲的