[强网杯 2019]随便注 1【SQL注入】
[强网杯 2019]随便注 1【SQL注入】
本文章中标题为个步骤涉及到的方法。
SQL查询

第一步,先判断注入点的传参方式,发现是get传参。
在输入框,随便输入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 line 1,说明后端参数后面有可能存在其他sql语句,我们在1’ or 1 = 1后面加一个#,将可能存在的其他sql语句注释掉,即:1' or 1 = 1#,成功输出了该表的所有数据,但是没有flag。

首先判断一下字段个数:-1' union select 1,2;#,系统提示return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);

可以看到系统把select等关键词都过滤了,我们可以使用堆叠注入的方式来绕过select关键字。
堆叠注入
简单介绍一下堆叠注入,堆叠注入(Stacked Query Injection)是一种 SQL 注入攻击技术,攻击者通过注入多个 SQL 语句到一个查询中,利用数据库支持堆叠查询的特性(即在同一条查询中执行多个 SQL 语句)来执行恶意操作。这类攻击利用了某些数据库管理系统(DBMS)允许多个 SQL 语句在一个查询中堆叠执行的特性,通常通过分号(;)分隔不同的 SQL 语句。
查看数据库名:1';show databases;#

查看数据表:1';show tables;#

查看表结构
注意:tableName如果是纯数字,需要用`包裹
1 | |
报错注入
这里是中插一种思路,因为在报错注入查询 数据库名字的时候是不用select的,所以在这里我们是可以用的:
1 | |
但是只能用于查询表明,数据库名,查询字段时不能用这种方法。
预编译
先解释一下什么是预编译语句,
通俗版一点,就是把 SQL 先给数据库“过一遍语法与优化器”,得到可执行的执行计划,然后多次执行时就复用计划,只换参数,不必每次重新解析与优化。
格式:
1 | |
例如:
1 | |
因为select关键字被过滤了,所以我们可以通过预编译的方式拼接select 关键字:1';PREPARE hacker from concat('s','elect', ' * from 1919810931114514 ');EXECUTE hacker;#得flag。
预编译语句 将语句进行16进制编码
可以直接将select * from 1919810931114514``语句进行16进制编码,即:73656c656374202a2066726f6d20603139313938313039333131313435313460,替换payload:
1 | |
更改表名
最后一步也可以通过修改表名和列名来实现。我们输入1后,默认会显示id为1的数据,可以猜测默认显示的是words表的数据,查看words表结构第一个字段名为id我们把words表随便改成words1,然后把1919810931114514表改成words,再把列名flag改成id,就可以达到直接输出flag字段的值的效果:
1 | |
然后通过1' or 1 = 1 #,成功获取到flag。
- 修改表名:
ALTER TABLE 旧表名 RENAME TO 新表名; - 修改字段:
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型;
handle
此题还可以通过handle直接出答案:1';HANDLER 1919810931114514OPEN;HANDLER1919810931114514READ FIRST;HANDLER1919810931114514 CLOSE;
- handle不是通用的SQL语句,是Mysql特有的,可以逐行浏览某个表中的数据,格式:
1 | |
references
[强网杯 2019]随便注 1【SQL注入】四种解法 - 知乎
[BUUCTF 强网杯 2019]随便注 1(两种方法)-CSDN博客