简介
上篇文章中我们讲述了如何进行手工注入,也通过墨者学院的靶场,真实的感受了SQL注入的感觉。这篇文章我们将继续介绍SQL注入。
高权限注入
含义
世界上有千千万万的网站,我们也都知道网站需要部署在服务器上,但是如果一台服务器上只部署一个网站,那么对于服务器将的资源将会是一个巨大的浪费。毕竟不是每个网站都是需要整台服务器发挥所有性能,许许多多的一些网站只需要比较少的服务器资源和配置就可以流畅的运行。本着对资源的节约,所以一台服务器上大多数情况下不会只存放一个网站,毕竟一台服务器的价格也是不低。
既然一台服务器上可能会挂着许多的网站,那么每个网站就都会有不同的管理员。我们必须规定每个网站对应的管理员只能对自己网站的数据进行操作。也就是需要对其进行权限的设置。
我们知道了一台服务器上会有许多的网站,并且现在绝大多数的网站必须都要使用数据库。每个网站都会有一个管理员,但是如果我们能找到比管理员还要高级别的用户,那么就有可能实现高权限的注入。
MySQL最高权限用户root
在MySQL数据库中,root是拥有最高权限的用户。
跨库注入
上文中我们了解到了MySQL中最高权限的用户root,那么当我们可以使用root用户时,就可以对服务器上数据库中的各个不同网站的数据进行任意的修改。
为什么要用跨库注入?
有人可能会问,我们为什么要进行跨库注入呢?我只要渗透目标网站就好了,为什么还需要进行跨库注入去在别的站点进行数据的修改或者获取呢?
其实我们之所以要使用跨库注入,原因可不是为了去别的网站搞破坏,我们就是为了渗透入侵目标网站。
有的时候我们会遇到目标网站防护做的比较好,很难找到突破口对其进行入侵。这时呢,我们就可以对目标网站所在的服务器下下功夫。如果说恰好你目标网站所在的服务器上有那么几个防护做的非常差的,或者是可能没什么人管理的站(也就是我们俗称的旁站),我们就可以先对这个网站进行入侵,在拿到高的权限后,在进行跨库注入对我们的目标网站进行入侵。
- 旁站:指的是部署在同一台服务器上的网站,他们互相被称为旁站
实践
我们通过sqlilabs进行跨库注入的演示
- 如果你没有安装sqlilabs靶场,可以参考我的这篇文章:sqlilabs靶场安装
我们使用Less-2(第二关)作为演示
我们首先试验一下该网站是否存在SQL注入漏洞
- 该靶场就是SQL注入的靶场,这一步看似不重要,但是仍希望大家能够不要省去这个步骤,目前你是在靶场中练习,理所应当认为就是有漏洞的,但是当你去挖掘漏洞时,大多数的情况下我们是进行黑盒测试,所以说寻找漏洞的步骤就是其中很关键的一步,毕竟发现问题往往比解决问题要困难,希望大家能够保持良好的习惯
在地址栏输入?id=1
我们发现当我们通过Get方式传入id时,网站对我们传递的参数,有获取并代入数据库查询,并返回相应的数据,说明可能存在注入点
- 有SQL注入存在的地方(注入点)往往就是对用户传入的参数有进行获取并且代入数据库查询
- 因为我们传入的参数可以带入查询,就可以不传入正常的参数,而是传入恶意的攻击语句
我们在?id=1后加上 and 1=2
发现页面饭会出现错误,说明此处存在注入点。也就是说我们可以进行SQL注入了
SQL注入的开始往往都是需要猜解有几个字段
- 输入order by 1
- 输入order by 2
- 输入order by 3
- …
当然你也可以从比较大开始试,并不一定要从1开始。
当我们输入order by 4时页面报错,说明字段数为4-1=3
这时我们将id=-1,并且使用联合查询
- id=-1的操作是为了让联合查询的前半句为假
- ?id=-1 union select 1,2,3
查看返回的页面可知,我们可以在2和3处进行敏感信息的查询,我们查询数据库连接的用户
- ?id=-1 union select 1,user(),3
发现是root,也就是说我们可以通过该网站对数据库中的其他库(不属于该网站的)进行注入
- 这也就是我们说的跨库注入
想使用SQL语句的话我们还需要知道数据库名、表名还有字段名
我们先查询服务器上的所有数据库名
- ?id=-1 union select 1,schema_name,3 from gourp_concat(information_schema.schemata)
- 一定不要忘记group_concat,否则只会出现一个数据库名
服务器上所有的数据库名我们都有了,那么就可以选择其中的库进行跨库注入
这里可能有的人会问我怎么知道,哪个网站对应的数据库叫什么?
一般说来,数据库的名字和网站的名字会是有关联的。但是如果真的遇到脑子不好的管理员乱命名,我们也可以通过逐个尝试的方法,对比里面的数据,来确定数据库对应的网站。
我们这里选择sqlinsert这个网站的数据库进行跨库注入
- 该数据库是我额外建立的数据库用于进行跨库注入实验
获取sqlinsert数据库下的所有表名
- ?id=-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_shchema=‘sqlinsert’
如果说这一步报错了,应该是遭到了魔术引号的转移,可以查看:sqlilabs手工注入遇到魔术引号解决方法
我们查询到表名之后,发现一张比较敏感的表——user
- user一般存放的是用户或者管理员的信息
- 当然也会有admin等命名方式
所以这时我们可以针对user表进行查询,需要查询user这张表,我们还需要知道user表中的字段名
- ?Id=-1 union select 1,group_concat(column_name),3 from information_schmea.columns where table_name=‘user’ and table_shcema=‘sqlinsert’
- 该处加上了and,是为了避免别的库中也有user这张表,查询成别的库中的user表
得知了user表中的字段名后,我们就可以查询user中的数据了
- ?id=-1 union select 1,group_concat(username),group_concat(password) from sqlinsert.user
至此我们通过sqlilabs网站对sqlinser网站进行跨库注入就完成了。
结束语
希望我的文章都够帮助到你 😃
已同步更新至个人博客:https://www.hibugs.net/security/vulnerability/sql-insert/lamar/high-authcross-insert