[GHCTF 2025]SQL??? 【sqlite注入】
梳理一下SQLite注入
常见指令
查看版本:sqlite_version()
列出附加数据库中的所有表:.tables
注入步骤
先查字段:
1' order by 5 #
三板斧:
0' union select 1,2,sql from sqlite_master;
sql字段存储创建该数据库对象时所使用的 SQL 语句,也就是说可以看见这个表是怎么被创建的0' union select 1,2,sql from sqlite_master where type='table';
这里的type为table,也就是说只关注类型为表的内容,也就是说只关注表0' union select 1,2,sql from sqlite_master where type='table' and name='user_data';
这里的name限制了要搜查的表的内容中,名字叫user_data的那个
sqlite_master
表的具体结构
列名 | 数据类型 | 描述 |
---|---|---|
type | TEXT | 表示数据库对象的类型。常见的值有: - 'table' :代表普通的表。- 'index' :代表索引,用于提高查询效率。- 'view' :代表视图,是虚拟表,基于 SQL 查询结果。- 'trigger' :代表触发器,是与表相关的特殊程序,在特定事件发生时自动执行。 |
name | TEXT | 存储数据库对象的名称。比如,如果是表,就是表名;如果是索引,就是索引名,依此类推。 |
tbl_name | TEXT | 该列存储与该对象关联的表的名称。对于表本身而言,tbl_name 通常和 name 是相同的;但对于索引、视图和触发器,它指向它们所关联的表。例如,一个索引是为 users 表创建的,那么 tbl_name 就是 'users' 。 |
rootpage | INTEGER | 此列存储该对象数据存储的页号。在 SQLite 中,数据是按页存储的。不过对于某些对象(像视图),该值可能为 0,因为视图并不实际存储数据,只是一个查询定义。 |
sql | TEXT | 存储创建该数据库对象时所使用的 SQL 语句。这个语句非常有用,因为它可以用来重新创建该对象。例如,如果你想知道一个表是如何创建的,就可以查看这个表对应的 sql 列的值。 |
题目
这张是我见过最好看的灰原哀了
注入show databases发现报错了直接
又因为show databases只在MySQL中存在,但是在SQLite中无法使用,所以这道题是SQLite注入
先判断有几列
第六列出现报错界面
爆出来表名
sqlite_master
是 SQLite 中的一个系统表,它存储了数据库中所有对象(如表、视图、索引等)的定义信息。攻击者通过这个函数可以获取数据库中所有对象的名称。
在name这一列中是所包含的表的名字,也就是flag和users
/?id=1 union select 1,2,3,4,group_concat(sql) from sqlite_master
group_concat(sql) | 聚合sqlite_master 表中所有表的SQL定义语句 |
sqlite_master | SQLite系统表,记录所有用户表的定义信息(相当于MySQL的information_schema ) |
返回的内容别看他这么乱,实际上长这样:
所以我们要找的就是flag表里的flag列
所以直接payload:
/?id=1 union select 1,2,3,4,flag from flag
拿到flag