我试图构建一个可以用于任意代码执行的函数列表。其目的不是列出应该列入黑名单或以其他方式禁止的函数。更确切地说,我希望在搜索受感染的服务器以寻找后门时,有一个易于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,因为它是另一类利用的一部分。)


当前回答

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

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

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

其他回答

php手册上的倒勾操作符

还要注意允许任意内存位置被读写的“中断漏洞”类!

这些影响函数,如trim(), rtrim(), ltrim(),爆炸(),strchr(), strstr(), substr(), chunk_split(), strtok(), addcslashes(), str_repeat()等。这主要(但不完全)是由于该语言的调用时引用传递特性,该特性已经被弃用了10年,但并没有被禁用。

欲了解更多信息,请参阅Stefan Esser在BlackHat USA 2009 Slides Paper上关于中断漏洞和其他底层PHP问题的演讲

本文还展示了如何使用dl()来执行任意系统代码。

我特别想将unserialize()添加到这个列表中。长期以来,它一直存在各种漏洞,包括任意代码执行、拒绝服务和内存信息泄漏。永远不应该对用户提供的数据调用它。这些vuls中的许多已经在过去的露水年的发布中被修复,但它仍然保留了一对讨厌的vuls,在目前的写作时间。

要了解其他关于危险php函数/使用的信息,请参阅加固php项目及其建议。还有最近的PHP安全月和2007年的PHP bug月项目

还要注意,按照设计,反序列化对象将导致执行构造函数和析构函数;另一个不调用用户提供的数据的原因。

我猜,通过解析源文件,您无法真正找到所有可能的漏洞。

此外,如果这里提供了非常好的列表,你可能会错过一个可以利用的函数 仍然有可能存在像这样“隐藏”的邪恶代码

$myEvilRegex = base64_decode('Ly4qL2U='); preg_replace (myEvilRegex美元$ _POST['代码']);

您现在可以说,我只是扩展我的脚本来匹配它 但随后你可能会有“可能是邪恶的代码”,这也脱离了它的上下文 因此,为了(伪)安全,您应该真正编写好代码并自己阅读所有现有代码

除了eval语言结构之外,还有一个允许任意代码执行的函数:assert

assert('ex' . 'ec("kill --bill")');