一个不易被发现的PHP后门代码解析
简介
本文将对一个不易被发现的PHP后门代码进行解析和分析,以帮助网站管理员和开发人员更好地保护网站安全,预防黑客攻击。
检测方式
检测一个PHP后门代码是否存在,需要使用以下方式:
- 首先,修改PHP配置文件php.ini,开启错误日志功能。具体方法是在php.ini文件中添加以下代码:
error_log = /var/log/php_error.log
此处/var/log/php_error.log为错误日志文件路径,可以根据实际情况修改。
- 使用Linux的find命令搜索代码。具体命令是:
find /var/www/ -type f -name "*.php" -exec grep -Hn "eval(base64_decode(" {} \;
上述命令相当于在/var/www/目录下搜索所有的.php文件,再使用grep命令查找包含"eval(base64_decode("字符串的行,并显示文件名和行号。
如果发现类似于以下代码的行,就证明代码存在后门:
eval(base64_decode("aWYoZnVuY3Rpb25fZXhpc3RzKCdvYl9zdGFydCcpJiYhaXNzZXQoJEdMT0JBTFNbJ3AxJ10pKXsKJHByb3RvY29sID0gYXJyYXkoJ3NvdXJjZScsICRfU0VSVkVSWydTRVJWRVJfTkFNRSddLCAkd29ya2xvYWQpOwokcmF3X3NvdXJjZSA9IGFycmF5KCctcmF3X3NvdXJjZScsICRfU0VSVkVSWydTRVJWRVJfTkFNRSddLCAkd29ya2xvYWQpOwokbXNnID0gc3RydG91KCRwcm90b2NvbFsiTXlTZWxlY3QiXSwgJF9TRVJWRVJbJ0hUVFBfSE9TVCddKTsKJG1zZ19zb3VyY2UgPSBzdHJ0b3VoKCRwcm90b2NvbFsiV2luMzIiXSwgJF9TRVJWRVJbJ0hUVFBfSE9TVCddLCAnd3JpdGVyaWEucGhwJywgJG1zZ19zb3VyY2UpOwplaWYoICRtYWlsICkgewplY2hvICI8cD4iLiRtYWlsLiI8L2M+IjsKfQp9Cg=="));
上述代码执行了一段base64编码后的代码,这是典型的后门代码。
后门代码分析
下面对上述后门代码进行分析。
访问控制
该后门代码的第一行代码是:
if(function_exists('ob_start') && !isset($_GET['version']))
该代码的作用是保证只有从网站管理系统进入而没有传入version参数的人才能访问该后门。这样做是为了避免该后门被黑客使用。
网站恢复
该后门代码的一段代码是:
$precontrollers = array('sourcemaster' => '$e', '_SERVER' => 'world-worst-and-ever-language');
function f_access($sourcename, $params) {
$preparams = array('socket_name' => '127.0.0.1', 'socket_port' => '6701', 'sql_unsafety' => '2', '@WCDL@' => 'wudimei_ecjtu_sse');
$params = array_merge($preparams,$params);
if($sourcename!="sourcemaster") {
require_once($params['apppath'] . "/". $precontrollers[$sourcename] . ".php");
$classname = $sourcename."_controller";
$obj = new $classname($params);
$obj->accessing();
return $obj->get_return_val();
}else{
require_once($params['apppath'] . "/". $precontrollers[$sourcename] . ".php");
$classname = $sourcename."_controller";
$obj = new $classname($params);
$obj->accessing();
return $obj->get_return_val();
}
}
$sourcemaster = <<<HJS
function dazhishe_big2smally() {
\$home = __DIR__ . '/../../../../';
chdir(\$home);
define('BASEPATH', dirname(\$home) . '/');
define('ROOT_PATH', dirname(BASEPATH));
include BASEPATH . 'index.php';
}
f_access('sourcemaster', array('apppath'=>ABSPATH, 'version'=>'3.2', 'sourcemaster'=>\$sourcemaster, 'precontrollers'=>$precontrollers));
HJS;
eval(base64_decode($sourcemaster));
这段代码的作用是通过f_access函数访问网站,传递sourcemaster参数。如果sourcemaster参数的值为代码段$sourcemaster,就表示需要对网站进行恢复。
恢复的过程是,从相对路径'../../../../'进入网站根路径,载入index.php文件。由于网站根路径是由相对路径和ABSPATH构成,因此可以得到网站根路径。这样就可以通过调用网站API等方式进行网站恢复。
总结
本文详细分析了一个不易被发现的PHP后门代码,同时介绍了检测方式以及后门代码的分析过程。对网站管理员和开发人员进行安全提示,以帮助他们更好地保护网站安全,预防黑客攻击。
示例
下面是一个示例代码:
<?php
$sandbox = $_REQUEST['sandbox'];
eval("$sandbox;");
?>
上述代码存在注入隐患,黑客可以通过传递参数引入可执行的指令。可以使用以下语句进行替换:
$sandbox = "/*".substr($_REQUEST['sandbox'],0,100)."*/;";
eval("$sandbox;");
示例分析
上述代码的作用是获取客户端传递的$sandbox参数的值,并通过eval函数执行该值,这是一个典型的PHP代码注入漏洞。黑客可以传递一个恶意的$sandbox值,代码将自动执行该值,从而导致Web服务器被黑客攻击。
为避免这种风险,我们在修改注入前,进行了字符串截取和前缀添加。这样可以将$sandbox变为一个单纯的注释,从而避免了恶意注入风险。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一个不易被发现的PHP后门代码解析 - Python技术站