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


当前回答

平台特定的,但也是理论的执行向量:

dotnet_load () 新的COM(“WScript.Shell”) 新的Java(“java.lang.Runtime”) Event_new()—非常最终

而且还有更多的伪装方法:

Proc_open是popen的别名 中的call_user_func_array (exE .chr(99),数组(“/ usr / bin /损害”,“——”)); File_put_contents ("/cgi-bin/ nextinvoke .cgi") && chmod(…) setDefaultStub -检查.phar文件中的代码 runkit_function_rename("exec", "innocent_name")或APD rename_function

其他回答

平台特定的,但也是理论的执行向量:

dotnet_load () 新的COM(“WScript.Shell”) 新的Java(“java.lang.Runtime”) Event_new()—非常最终

而且还有更多的伪装方法:

Proc_open是popen的别名 中的call_user_func_array (exE .chr(99),数组(“/ usr / bin /损害”,“——”)); File_put_contents ("/cgi-bin/ nextinvoke .cgi") && chmod(…) setDefaultStub -检查.phar文件中的代码 runkit_function_rename("exec", "innocent_name")或APD rename_function

您可以在RIPS /config/sink .php中找到持续更新的敏感接收器(可利用的php函数)及其参数列表,这是一个用于php应用程序漏洞的静态源代码分析器,也可以检测php后门。

危险的语法元素怎么办?

“变量变量”($$var)将在当前作用域中找到一个名为$var的变量。如果使用错误,远程用户可以修改或读取当前作用域中的任何变量。基本上是一个较弱的eval。

例如:你写一些代码$$uservar = 1;,然后远程用户将$uservar设置为“admin”,导致$admin在当前范围内被设置为1。

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

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

我很惊讶没有人提到echo和print作为安全利用点。

跨站脚本(XSS)是一种严重的安全漏洞,因为它比服务器端代码执行漏洞更常见。