网站地图    收藏   

主页 > 后端 > 网站安全 >

PHP create_function()注入命令执行漏洞 - 网站安全

来源:自学PHP网    时间:2015-04-17 11:59 作者: 阅读:

[导读] 在PHP中使用create_function()创建匿名函数,如果没有严格对参数传递进行过滤,攻击者可以构造特殊字符串传递给create_function()执行任意命令。以如下代码为例:?php//how to exp this code$sort_b...

PHP中使用create_function()创建匿名函数,如果没有严格对参数传递进行过滤,攻击者可以构造特殊字符串传递给create_function()执行任意命令。 
 
以如下代码为例: 
 
<?php
//how to exp this code
$sort_by=$_GET['sort_by'];
$sorter='strnatcasecmp';
$databases=array('test','test');
$sort_function = '  return 1 * ' . $sorter . '($a["' . $sort_by . '"], $b["' . $sort_by . '"]);';
usort($databases, create_function('$a, $b', $sort_function));
?>
代码中$sort_by直接用$_GET取值未做过滤,create_function()中的函数体部分$sort_function只是简单的字符串拼接,利用注入将我们的代码写进去。 
 
这里我们首先测试将phpinfo();注入到create_function()的函数体部分$sort_function中。 
 
保存以上代码为func.php,然后提交func.php?sort_by="]);}phpinfo();/*执行结果如图所示: 
 
 
如图所示phpinfo()函数执行了。 
 
在具体分析细节之前,先说一下create_function()。 
 
create_function返回一个字符串的函数名, 这个函数名的格式是: 
 
"\000_lambda_" . count(anonymous_functions)++   
 
我们来看看create_function的实现步骤: 
 
1. 获取参数, 函数体; 
 
2. 拼凑一个"function __lambda_func (参数) { 函数体;} "的字符串; 
 
3. eval; 
 
4. 通过__lambda_func在函数表中找到eval后得到的函数体, 找不到就出错; 
 
5. 定义一个函数名:"\000_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();/*放到函数中去,如图所示: 
 
 
可以看到提交sort_by参数中的“}”闭合生成的匿名函数的“{”,所以这里的phpinfo()会被zend_eval_string执行。 
 
测试执行系统命令,如下所示: 
 

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

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论