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


当前回答

代码中的大多数攻击使用多个访问源或多个步骤来执行自己。我不仅会搜索含有恶意代码的代码或方法,还会搜索所有执行或调用它的方法、函数。最好的安全性还包括对输入和输出的表单数据进行编码和验证。

在定义系统变量时也要注意,它们之后可以从代码中的任何函数或方法调用。

其他回答

我知道move_uploaded_file已经被提到了,但是文件上传通常是非常危险的。仅仅是$_FILES的存在就应该引起一些关注。

可以将PHP代码嵌入到任何类型的文件中。带有文本注释的图像尤其容易受到攻击。如果代码按原样接受在$_FILES数据中找到的扩展名,那么这个问题就特别麻烦。

例如,用户可以上传一个有效的带有嵌入式PHP代码的PNG文件作为“foo.php”。如果脚本特别简单,它实际上可能会将文件复制为“/uploads/foo.php”。如果服务器被配置为允许在用户上传目录中执行脚本(通常情况下,这是一个严重的疏忽),那么您可以立即运行任何PHP代码。(即使图像保存为。png格式,也有可能通过其他安全漏洞让代码执行。)

一份(非详尽的)上传检查清单:

一定要分析内容,以确保上传的内容是它所声称的类型 将文件保存为一个已知的、安全的文件扩展名,该扩展名永远不会被执行 确保在用户上传目录中禁用PHP(以及任何其他代码执行)

php手册上的倒勾操作符

使用4bit发现了几个缓冲区溢出 字符解释文本的函数。 htmlentities () htmlspecialchars函数()

人在巅峰时,好的防御是用什么方法 Mb_convert_encoding()转换为单个 先编码再解释。

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

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

这里没有提到一个有趣的漏洞来源。PHP允许字符串中包含0x00字节。底层(libc)函数将此作为字符串的结束。

这允许在某些情况下(糟糕的实现)在PHP中的健康检查可以被愚弄,例如在如下情况下:

/// note: proof of principle code, don't use
$include = $_GET['file'];
if ( preg_match("/\\.php$/",$include) ) include($include);

通过调用script.php?file=somefile%00.php,这可能包括任何文件——不仅仅是以.php结尾的文件

因此,任何不遵守PHP字符串长度的函数都可能导致一些漏洞。