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

Если вдруг кому пригодится - для unix-сокетов есть еще один замечательный вариант обхода валидации:
PHP код:
main/streams/xp_socket.c

static inline int parse_unix_address(php_stream_xport_param *xparamstruct sockaddr_un *unix_addr TSRMLS_DC)
{
    
memset(unix_addr0sizeof(*unix_addr));
    
unix_addr->sun_family AF_UNIX;

    
/* we need to be binary safe on systems that support an abstract
     * namespace */
    
if (xparam->inputs.namelen >= sizeof(unix_addr->sun_path)) {
        
/* On linux, when the path begins with a NUL byte we are
         * referring to an abstract namespace.  In theory we should
         * allow an extra byte below, since we don't need the NULL.
         * BUT, to get into this branch of code, the name is too long,
         * so we don't care. */
        
xparam->inputs.namelen sizeof(unix_addr->sun_path) - 1;
        
php_error_docref(NULL TSRMLS_CCE_NOTICE,
            
"socket path exceeded the maximum allowed length of %lu bytes "
            "and was truncated"
, (unsigned long)sizeof(unix_addr->sun_path));
    }

    
memcpy(unix_addr->sun_pathxparam->inputs.namexparam->inputs.namelen);

    return 
1;

В случае если путь к unix-сокету превышает sockaddr_un.sun_path (char sun_path[108]; ) PHP просто усекает путь и выплевывает нотис. Не совсем ясна подобная логика, ну да ладно...

PoC:
PHP код:
php var_dump(fsockopen('unix:///tmp/1.sock'80));
PHP Warning:  fsockopen(): unable to connect to unix:///tmp/1.sock:80 (No such file or directory) in php shell code on line 1

Warningfsockopen(): unable to connect to unix:///tmp/1.sock:80 (No such file or directory) in php shell code on line 1
bool(false)
php var_dump(fsockopen('unix:///tmp/////////////////////////////////////////////////////////////////////////////////////////////////1.sock'80));
PHP Notice:  fsockopen(): socket path exceeded the maximum allowed length of 108 bytes and was truncated in php shell code on line 1

Notice
fsockopen(): socket path exceeded the maximum allowed length of 108 bytes and was truncated in php shell code on line 1
resource
(2of type (stream
Как видно во втором случае ":80" просто обрезалось.
Кейс достаточно редкий, но может кому будет полезен.

Последний раз редактировалось dharrya; 15.08.2015 в 00:10..
dharrya вне форума   Ответить с цитированием