今天网站被人入侵了,一查被上传的php文件内容,发现有 eval(gzinflate(base64_decode(‘XXXXXX’)));此类代码,自己就想查一下代码到底执行了哪些操作。
首先去掉eval()函数,echo打印一下原始代码,结果发现还是类似这样的代码,原来这玩意不简单呀。
那么这些加密是怎么做到的。其实也没什么的,就是循环N次使用gzinflate压缩代码而已,我们需要通过多次循环把代码反解出来即可,由于人工操作循环的效率太差,于是写个函数处理吧。
#解密函数
function decode($str)
{
$maxTimes = 1000; //最大循环解密次数
$matches = [];
for ($i = 0; $i < $maxTimes; $i++) {
$arr = preg_split('/\r\n|\r|\n/', $str);
$match = false;
foreach ($arr as $s) {
if (preg_match('/eval\((gzinflate\(base64_decode\([\'\"]([\w\/=+]+)[\'\"]\)\))\)/', $s, $matches)) {
ob_start();
eval('echo '.$matches[1].';');
$str = ob_get_clean();
$match = true;
break;
}
}
if (!$match) {
break;
}
}
return $str;
}
#使用方法(xxx.php 代表挂马文件)
$string = file_get_contents("xxx.php");
echo decode($string);
总结:防止被别人挂马,尽量少给php权限,主要有以下几点。
1、php-fpm进程不要以root用户启动,创建一个无任何权限的用户启动;
2、项目代码目录的权限尽量不给php进程用户;
3、mysql数据库不要空密码;
当然,能找到漏洞的代码修复就更好了。
关于PHP,eval、gzinflate、base64_decode函数相关的挂马代码反解就是这样了。发现网上的其他转载的代码解密并不适用,或者执行有问题,于是自己就重写了这个解密函数。