这玩意用来记录一下我前天大晚上不睡觉理解的一个题目,没啥意思,没多少基础的东西,勿看
众所周知在数据库语句中是通过 ;
来判断一个语句有没有结束的,堆叠注入的意思就是,一条里面有多个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是我乱敲的