先说原因:PreparedStatement 预编译,再填充参数的,就算参数是字符串拼接的方式,也会把整体当成1个参数,不再进行语法语义等分析。
测试例子1:
1 创建存储过程如下: 2 drop procedure if exists `insert_test`; 3 delimiter && 4 create procedure `insert_test`(in pdatas mediumblob) 5 begin 6 declare stmt mediumblob default ''; 7 start transaction; 8 9 set @a = pdatas; 10 set @sqlstr = ''insert into test(name, level) value (?,1); 11 prepare stmt from @sqlstr; 12 execute stmt using @a; 13 deallocate prepare stmt; 14 15 commit; 16 end 17 &&
执行注入语句:
1 call insert_test("aa,1),(bb,");
如果能注入,则产生2条数据,而结果是一行数据:
name:aa,1),(bb,
level:1
说明,就算字符串以拼接的方式执行,还是会把字符串整体,当成1个参数