PHP create_function()注入命令执行漏洞

  • A+
所属分类:lcx

winxwin 发表于 2012-9-16 21:39

在PHP中使用create_function()创建匿名函数,如果没有严格对参数传递进行过滤,攻击者可以构造特殊字符串传递给create_function()执行任意命令。

以如下代码为例:

代码中$sort_by直接用$_GET取值未做过滤,create_function()中的函数体部分$sort_function只是简单的字符串拼接,利用注入将我们的代码写进去。

这里我们首先测试将phpinfo();注入到create_function()的函数体部分$sort_function中。

保存以上代码为func.php,然后提交func.php?sort_by="]);}phpinfo();/*执行结果如图所示:

PHP create_function()注入命令执行漏洞

如图所示phpinfo()函数执行了。

在具体分析细节之前,先说一下create_function()。

create_function返回一个字符串的函数名, 这个函数名的格式是:

"00_lambda_" . count(anonymous_functions)++  

我们来看看create_function的实现步骤:

1. 获取参数, 函数体;

2. 拼凑一个"function __lambda_func (参数) { 函数体;} "的字符串;

3. eval;

4. 通过__lambda_func在函数表中找到eval后得到的函数体, 找不到就出错;

5. 定义一个函数名:"00_lambda_" . count(anonymous_functions)++;

6. 用新的函数名替换__lambda_func;

7. 返回新的函数。

实际上,create_functions是一个ZEND_FUNCTION,它被定义在./Zend/zend_builtin_functions.c中。

eval_code = (char *) emalloc(eval_code_length);

sprintf(eval_code, "function " LAMBDA_TEMP_FUNCNAME "(%s){%s}", Z_STRVAL_PP(z_function_args), Z_STRVAL_PP(z_function_code));

eval_name = zend_make_compiled_string_description("runtime-created function" TSRMLS_CC);

retval = zend_eval_string(eval_code, NULL, eval_name TSRMLS_CC);

可以看到这里只是简单利用zend_eval_string来生成匿名函数,此处"function " LAMBDA_TEMP_FUNCNAME "(%s){%s}",我们可以控制函数主体部分闭合前面的“{”,后面跟上我们的phpinfo()函数,将提交的参数sort_by="]);}phpinfo();/*放到函数中去,如图所示:

PHP create_function()注入命令执行漏洞

可以看到提交sort_by参数中的“}”闭合生成的匿名函数的“{”,所以这里的phpinfo()会被zend_eval_string执行。

测试执行系统命令,如下所示:

PHP create_function()注入命令执行漏洞

PHP create_function()注入命令执行漏洞

转自:https://www.t00ls.net/viewthread.php?tid=20774

文章来源于lcx.cc:PHP create_function()注入命令执行漏洞

相关推荐: 黑客改造脑波耳机,让您可以通过思想控制建筑物

在计算机普及的今天,我们已经逐渐可以让身边的基础设施,例如物体,家具等更智能化来适应人类的生活。但想一想,如果要让人类通过思想来控制一面墙或者一个房间的行为,是不是很难呢? 这就是土耳其建筑师 Guvenc Ozel 的灵感来源,他建造了一间智能小屋 Cere…

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: