SQL预处理
这边建议你有了SQL的基础,再来读这篇文章。
1 原理
即时 SQL
一条 SQL 直接是走流程处理,一次编译,单次运行,此类普通语句被称作 Immediate Statements (即时 SQL),具体如下
词法和语义解析;
优化 SQL 语句,制定执行计划;
执行并返回结果;
但是,在绝大多数情况下,如果需求某一条 SQL 语句被反复调用执行,或者每次执行的时候只有个别的值不同。如果每次都需要经过上面的词法语义解析、语句优化、制定执行计划等,则效率就明显降低了许多。这个时候就需要预处理sql
预处理SQL
预编译语句的优势在于归纳为:一次编译、多次运行,省去了解析优化等过程;此外预编译语句能防止 SQL 注入。 MySQL 预处理语句的支持版本较早,所以我们目前普遍使用的 MySQL 版本都是支持这一语法的。
2 利用
MySQL 官方将 prepare、execute、deallocate 统称为 PREPARE STATEMENT。翻译也就习惯的称其为预处理语句
其实这主要是和concat函数在堆叠注入用在一起当做一种SQL注入的利用姿势!(我的理解)
当然了,预处理可以和char函数,16进制等等方式来结合!
1 | PREPARE name from '[my sql sequece]'; //预定义SQL语句() |
1 用于字符串的拼接操作
例如下面的语句
1 | username=1';set @sql=concat('up','date `score` set listen=123 where username="火华"');prepare sql_exe FROM @sql;execute sql_exe# 还是newstarctf的一道题为例子 |
由于题目过滤了update,但我们却要使用,就只能采取这种预处理的方式。不然只能考虑换关键字,换方法了。
强网杯的随便注也可以用这种姿势。
2 用来变量的定义替换