我试图构建一个可以用于任意代码执行的函数列表。其目的不是列出应该列入黑名单或以其他方式禁止的函数。更确切地说,我希望在搜索受感染的服务器以寻找后门时,有一个易于grep-able的红旗关键字列表。

其思想是,如果您想构建一个多用途的恶意PHP脚本——例如c99或r57这样的“web shell”脚本——您将不得不在文件中的某个位置使用一个或多个相对较小的函数集,以便允许用户执行任意代码。搜索这些函数可以帮助您更快地将数万个PHP文件缩小到需要仔细检查的相对较小的脚本集。

显然,例如,以下任何一种代码都被认为是恶意的(或糟糕的编码):

<? eval($_GET['cmd']); ?>

<? system($_GET['cmd']); ?>

<? preg_replace('/.*/e',$_POST['code']); ?>

等等。

前几天在搜索一个受感染的网站时,我没有注意到一段恶意代码,因为我没有意识到preg_replace可以通过使用/e标志而变得危险(真的吗?为什么会出现这种情况?)还有其他我错过的吗?

以下是我目前列出的清单:

Shell执行

系统 执行 popen 撇号操作符 pcntl_exec

PHP执行

eval Preg_replace(带/e修饰符) create_function 包括[_once] /要求[_once](详见mario的回答)

有一个能够修改文件的函数列表可能也很有用,但我想99%的情况下,利用代码将至少包含上述函数之一。但是如果你有一个所有能够编辑或输出文件的函数的列表,把它贴出来,我会把它包括在这里。(我没有计算mysql_execute,因为它是另一类利用的一部分。)


当前回答

最近在security.stackexchange.com上对此有一些讨论

可用于任意代码执行的函数

好吧,这缩小了一点范围-但由于'print'可以用来注入javascript(因此窃取会话等),它仍然有点随意。

不是列出应该被列入黑名单或不允许的函数。相反,我想要一个grep-able列表

这是一个明智的方法。

不过,一定要考虑编写自己的解析器——很快你就会发现基于grep的方法会失控(awk会更好一点)。很快你就会开始希望你也实现了一个白名单!

除了那些显而易见的,我建议标记任何包含了字符串字面量以外的参数的东西。还要注意__autoload()。

其他回答

让我们将pcntl_signal和pcntl_alarm添加到列表中。

在这些函数的帮助下,您可以绕过php.ini或脚本中创建的任何set_time_limit限制。

例如,该脚本将运行10秒,尽管set_time_limit(1);

(感谢塞巴斯蒂安·伯格曼的推文和要点:

<?php
declare(ticks = 1);

set_time_limit(1);

function foo() {
    for (;;) {}
}

class Invoker_TimeoutException extends RuntimeException {}

class Invoker
{
    public function invoke($callable, $timeout)
    {
        pcntl_signal(SIGALRM, function() { throw new Invoker_TimeoutException; }, TRUE);
        pcntl_alarm($timeout);
        call_user_func($callable);
    }
}

try {
    $invoker = new Invoker;
    $invoker->invoke('foo', 1);
} catch (Exception $e) {
    sleep(10);
    echo "Still running despite of the timelimit";
}

这些函数也会产生一些不好的影响。

函数() unserialize () register_tick_function () register_shutdown_function ()

前两种方法会耗尽所有可用内存,而后者会继续耗尽内存……

下面是我的提供商出于安全考虑禁用的函数列表:

执行 戴斯。莱纳姆: 中将 apache_note apache_setenv closelog debugger_off debugger_on define_syslog_variables escapeshellarg escapeshellcmd ini_restore openlog passthru pclose pcntl_exec popen proc_close proc_get_status proc_nice proc_open proc_terminate shell_exec syslog 系统 url_exec

php手册上的倒勾操作符

这本身并不是一个答案,但这里有一些有趣的事情:

$y = str_replace('z', 'e', 'zxzc');
$y("malicious code");

同样,call_user_func_array()可用于执行模糊化函数。