PHP动态函数执行与匿名函数执行

<?php
/**

 * 动态函数执行与匿名函数执行\\

技术QQ交流群:294088839

 */
//动态函数执行
function a(){
    echo  'a';
}
function b(){
    echo 'b';
}
function c($c){
    echo 'c';
    $c();
}
//C($_GET['c']);
echo '<hr>';
//把一个函数名作为参数传进另一个函数中 然后调用相对应的函数
// 例如 如果传过来个a 就会调用a函数从而输出a
// 如果传过来一个PHP自带函数就会立刻执行  比如  phpinfo
// 利用性不高


// 匿名函数执行 也叫闭包函数  create_function这个匿名函数目前还没搞明白
// 貌似通过这个函数可以关闭要触发的函数 从而执行些我们想要执行的代码
// 有兴趣研究的可以探讨下
$id=$_GET['id'];
$str='echo  '.$a.'test'.$id.";";
$la=create_function('$a',$str);
//var_dump($la);
/*$array=array('reall long string here,boy','this','midding length','larcet');
usort($array,$la);*/

//print_r($array);

在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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Json____

您的鼓励是我创作的动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值