php 执行系统命令函数

电玩女神 2021-08-30 16:07 567阅读 0赞

目录

命令注入

system()函数

passthru()函数

exec()

shell_exec()函数

反引号 `

popen()函数

pcntl_exec()函数


命令注入

命令注入(Command Injection),对一些函数的参数没有做过滤或过滤不严导致的,可以执行系统或者应用指令(CMD命令或者 bash 命令)的一种注入攻击手段。

常见的执行系统命令的函数有

  1. system()
  2. passthru()
  3. exec()
  4. shell_exec()
  5. popen()
  6. proc_open()
  7. pcntl_exec()

system()函数

  1. string system ( string $command [, int &$return_var ] )

$command为执行的命令,&return_var可选,用来存放命令执行后的状态码

system()函数执行有回显,将执行结果输出到页面上

  1. <?php
  2. system("whoami");
  3. ?>

passthru()函数

  1. void passthru ( string $command [, int &$return_var ] )

和system函数类似,$command为执行的命令,&return_var可选,用来存放命令执行后的状态码

执行有回显,将执行结果输出到页面上

  1. <?php
  2. passthru("whoami");
  3. ?>

exec()

  1. string exec ( string $command [, array &$output [, int &$return_var ]] )

$command是要执行的命令

$output是获得执行命令输出的每一行字符串,$return_var用来保存命令执行的状态码(检测成功或失败)

exec()函数执行无回显,默认返回最后一行结果

  1. <?php
  2. echo exec("whoami");
  3. $test = "ipconfig";
  4. exec($test,$array);
  5. print_r($array);
  6. ?>

shell_exec()函数

  1. string shell_exec( string &command)

&command是要执行的命令

shell_exec()函数默认无回显,通过 echo 可将执行结果输出到页面

  1. <?php
  2. echo shell_exec("whoami");
  3. ?>

反引号 `

shell_exec() 函数实际上仅是反撇号 (`) 操作符的变体,当禁用shell_exec时,` 也不可执行

在php中称之为执行运算符,PHP 将尝试将反引号中的内容作为 shell 命令来执行,并将其输出信息返回

  1. <?php
  2. echo `whoami`;
  3. ?>

popen()函数

  1. resource popen ( string $command , string $mode )

函数需要两个参数,一个是执行的命令command,另外一个是指针文件的连接模式mode,有rw代表读和写。

函数不会直接返回执行结果,而是返回一个文件指针,但是命令已经执行。

popen()打开一个指向进程的管道,该进程由派生给定的command命令执行而产生。

返回一个和fopen()所返回的相同的文件指针,只不过它是单向的(只能用于读或写)并且必须用pclose()来关闭。

此指针可以用于fgets()fgetss()fwrite()

  1. <?php popen( 'whoami >> c:/1.txt', 'r' ); ?>
  2. <?php
  3. $test = "ls /tmp/test";
  4. $fp = popen($test,"r"); //popen打一个进程通道
  5. while (!feof($fp)) { //从通道里面取得东西
  6. $out = fgets($fp, 4096);
  7. echo $out; //打印出来
  8. }
  9. pclose($fp);
  10. ?>

proc_open()函数

  1. resource proc_open (
  2. string $cmd ,
  3. array $descriptorspec ,
  4. array &$pipes [, string $cwd [, array $env [, array $other_options ]]]
  5. )

与Popen函数类似,但是可以提供双向管道

  1. <?php
  2. $test = "ipconfig";
  3. $array = array(
  4. array("pipe","r"), //标准输入
  5. array("pipe","w"), //标准输出内容
  6. array("pipe","w") //标准输出错误
  7. );
  8. $fp = proc_open($test,$array,$pipes); //打开一个进程通道
  9. echo stream_get_contents($pipes[1]); //为什么是$pipes[1],因为1是输出内容
  10. proc_close($fp);
  11. ?>

pcntl_exec()函数

  1. void pcntl_exec ( string $path [, array $args [, array $envs ]] )

path是可执行二进制文件路径或一个在文件第一行指定了 一个可执行文件路径标头的脚本
args是一个要传递给程序的参数的字符串数组。

pcntllinux下的一个扩展,需要额外安装,可以支持 php 的多线程操作。

pcntl_exec函数的作用是在当前进程空间执行指定程序,版本要求:PHP > 4.2.0

  1. <?php
  2. pcntl_exec ( "/bin/bash" , array("whoami"));
  3. ?>

对这些危险函数,可以在php.ini中禁用,进行安全加固

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0F1dXV1dXV1dQ_size_16_color_FFFFFF_t_70

发表评论

表情:
评论列表 (有 0 条评论,567人围观)

还没有评论,来说两句吧...

相关阅读

    相关 通过PHP执行系统命令

    PS.这几天用PHP写了一个小工具,因为要部署在Linux,又要暂时使用sudo执行一些Shell命令,网上也有很多资料,但是有的要么就直接把Web服务器用户直接提升权限,要么

    相关 PHP系统函数

    字符串函数 strlen:获取字符串的长度,获取的是字符串的字节长度 字符:一个完整的符号,a,中 字节:由8位组成 一个字符最少等于一个字节:ASCII码,a