Análise de vulnerabilidade de execução remota de código PHP (CVE2019-11043)
Recentemente, o Mechuang Security Lab monitorou que o PHP divulgou oficialmente uma vulnerabilidade de alto risco à execução remota de código (CVE2019-11043) sob algumas configurações de Nginx + php-fpm.Um invasor pode usar essa vulnerabilidade para realizar um ataque de execução remota de código em um site de destino. Embora o impacto desta vulnerabilidade seja limitado, devido à abertura do arquivo de configuração, use a equipe de operação e manutenção do niginx + php-fpm para fazer a verificação automática e a verificação automática no tempo.
Linha do tempo da vulnerabilidade 0x00
De 14 a 18 de setembro , o pesquisador de segurança estrangeira Andrew Danau descobriu que, ao participar do CTF do mundo real, ao enviar o símbolo% 0a para a URL do servidor de destino, o serviço retornou uma exceção, suspeitando de uma vulnerabilidade.
Em 26 de setembro , o PHP publicou oficialmente um aviso de vulnerabilidade, indicando que: usando o servidor Nginx + php-fpm, em algumas configurações, há uma vulnerabilidade de execução remota de código, e a configuração tem sido amplamente usada para causar maiores danos.
De 21 a 22 de outubro , o PHP lançou oficialmente a atualização de vulnerabilidade, e o POC de vulnerabilidade foi tornado público.
Em 24 de outubro, o Laboratório No. 59 emitiu um aviso de vulnerabilidade.
Descrição da vulnerabilidade 0x01
Ao processar uma solicitação com% 0a em fastcgi_split_path_info no Nginx, PATH_INFO está vazio devido a uma quebra de linha \ n. E o php-fpm tem uma falha lógica ao lidar com o PATH_INFO estar vazio. Os invasores podem causar execução remota de código por meio de PAYLOAD cuidadosamente construído e utilizado. Mas a configuração fastcgi usada pelo Nginx não é a configuração padrão do Nginx.
0x02 versão afetada
Ao usar o servidor configurado com Nginx + php-fpm, e a seguinte configuração é adotada no arquivo de configuração nginx / conf / nginx.confg, haverá vulnerabilidades do RCE
Location ~[^/]\.php(/|$){
...
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass php:9000;
...
}
Quando o campo fastcgi_split_path_info é configurado como ^ (. +?. Php) (/.*) $ ;, um invasor pode disparar uma vulnerabilidade de execução remota de código por meio de uma carga útil cuidadosamente construída.O código POC publicado pelo GitHub é gravado em um Webshell no diretório do site Para abrir a criação de backdoor. Embora após o PHP> = 5.3.3, o php-fpm esteja integrado ao núcleo do php, o servidor com a configuração acima ainda corre o risco de ser atacado.
Princípio de vulnerabilidade 0x03
A configuração do lado do servidor é a seguinte:
O POC enviado ao servidor é fpm_main.c A conexão é a seguinte:
https://github.com/php/php-src/blob/master/sapi/fpm/fpm/fpm_main.c
A vulnerabilidade foi causada principalmente pelo fluxo insuficiente de env_path_info no arquivo sapi / fpm / fpm / fpm_main.c no PHP-FPM, causado pela introdução de \ n (% 0a) na linha 1150 do arquivo "fpm_main.c" O PATH_INFO passado pelo nginx para o php-fpm está vazio. Por sua vez, a combinação de FCGI_PUTENV e PHP_VALUE pode ser usada para modificar a configuração do php no processo atual do php-fpm. A execução de código arbitrário pode ser acionada quando a configuração especialmente construída entrar em vigor.
Recorrência da vulnerabilidade 0x04
Usando o ambiente vulhub, reproduza a vulnerabilidade CVE2019-11043.
Execute o docker-compose up -d no caminho do vulub / php / CVE-2019-11043 para gerar o ambiente de vulnerabilidade.Veja
as informações de configuração do servidor no diretório vulhub / php / CVE-2019-11043 do diretório.default.conf
Use a ferramenta phuip-fpizdam para explorar a vulnerabilidade .
Visite wget https://github.com/neex/phuip-fpizdam, descompacte e digite o diretório e execute go build para gerar phuip-fpizdam (esta ferramenta gerará automaticamente a versão correspondente do sistema operacional de acordo com o sistema operacional)
Use a ferramenta phuip-fpizdam que acabou de gerar para enviar dados O pacote
pode ser visto, aqui foi executado com êxito e, em seguida, visite http: // localhost: 8080 / index.php e traga o parâmetro a, onde a é o ponto de injeção onde a injeção de comando pode ser executada, usando / bin / sh ± c 'PAYLOAD' & , Injete códigos de comando, como id ou whoami, para descobrir que há um resultado de retorno para provar o uso bem-sucedido.
Há um lugar a ser observado aqui, porque o php-fpm iniciará vários subprocessos, portanto, ele precisa ser acessado várias vezes durante a injeção de comando até que o processo poluído seja acessado
Medidas de mitigação de emergência 0x05
Alto risco: os detalhes da vulnerabilidade e do código de teste foram divulgados.Recomenda-se atualizar o patch de atualização de segurança ou habilitar o exemplo de configuração oficialmente recomendado, ou implantar o WAF e outros equipamentos de proteção de segurança para monitorar a utilização da vulnerabilidade.
Dedução de ameaças: esta vulnerabilidade é uma vulnerabilidade de execução remota de código.Com base no número de usuários que usam o produto em todo o mundo, um invasor mal-intencionado pode desenvolver um programa de ataque automatizado que atinja a vulnerabilidade, implementa a implantação automática de programas de backdoor após a exploração da vulnerabilidade e libera o programa mineiro Ou programas maliciosos, como zumbis DDOS e cavalos de Troia, podem espalhar o worm, o que afeta o fornecimento normal de serviços da Web.
Sugestões de desenvolvimento de segurança: Os produtos da família PHP relataram várias vulnerabilidades de segurança no histórico.Recomenda-se que as empresas que usam este produto fortaleçam a filtragem de entrada do usuário por meio de códigos de desenvolvimento de segurança e prestem atenção aos anúncios de atualização de segurança a qualquer momento.
Método de defesa de reparo 0x06
- Modifique a expressão regular de fastcgi_split_path_info no arquivo de configuração do Nginx para não permitir caracteres não exibidos após .php
- Se as circunstâncias permitirem, suspenda o uso do serviço Nginx + php-fpm
- De acordo com os requisitos de negócios do seu ambiente de produção real, exclua a seguinte configuração
fastcgi_split_path_info ^ (. +?. Php) (/.*) $;
fastcgi_param PATH_INFO $ fastcgi_path_info;