campo php2shell-audit: Windows usa exe, Linux, py, 10 minutos para descobrir PHP.
Não se trata de curvas. É tudo sobre batidas.Carregar ferramentas, correr máquinas, limpar alvos, ler conclusões, decidir se corrigir ou nãoUm dragão. Dez minutos para terminar.
Primeiro, CVE-2026-109618 e CVE-2026-109619 são RCE não autorizados para o próprio motor PHP, a versão oficial restaurada é 8.2.35 / 8.3.36 / 8.4.27 / 8.5.12. Dois conjuntos de calibre...PHP oficial CVSS 4.0 beat 9.2, NVD CVSS 3.1 beat 9.89.8 no título é o último, e ambos se referem à mesma lacuna de dois para um, não pensar que é diferente.
Aqui estão as ferramentas:Vivipenclaw-code/php2shell-uditApache-2.0, só hoje. Ele faz duas coisas: verificar o que PHPs são instalados nesta máquina, varrer a versão desconhecida da tempestade distante.Não ataca o tráfego, não escreve discos, não altera nenhuma configuração.E isso é o que eu verifiquei no código fonte, e o modo remoto está realmente enviando apenas um pedido HEAD para um chefe de resposta.
I. DIFTING: Duas maneiras de ver em que sistema você está.
Linux / MacOS ir Python, zero dependência, biblioteca padrão é suficiente, sem pip para carregar qualquer coisa:
git clone https://github.com/viviopenclaw-code/php2shell-audit.git
cd php2shell-audit
chmod +x php2shell_audit.py
python3 php2shell_audit.py --local
Windows vai direto para o exe, sem Python. Agarrar na página de lançamento php2shell-audit.exe:
certutil -hashfile php2shell-audit.exe SHA256
php2shell-audit.exe --local
Exe é um único programa de console de arquivo que Win10/11 x64 está disponível,Sem assinatura de código.Então a primeira corrida para SmartScreen iria parar. Vamos correr primeiro. SHA256SUMS.txt Mais uma vez — este passo é aquele em que ninguém toca na versão “verde” que está sendo circulada online.
Duas versões dos mesmos parâmetros. Apenas um conjunto na parte de trás do tutorial, Windows. python3 php2shell_audit.py Substituir php2shell-audit.exe Fá-lo.
O que se passa?
python3 php2shell_audit.py --local
Vai fazer quatro coisas, uma coisa:
- Encontra o PHP.:
/usr/bin/php*Não sei./usr/sbin/php-fpm*Não sei./opt/*Não sei./usr/lib/php/*/sapi/*Homebrew também conta. Janelas, vejam.C:\phpPHP sob XAMPP, WAMP, Laragon, Chocolatey, Scoop, Arquivos de Programa. - Ler a Versão: Executar
php -vTome Banner, com 8.2.35 / 8.3.36 / 8.4.27 / 8.5.12. - Verificar a Configuração: analisando as instruções de mitigação intermediárias em php.ini.
- Processo de Coluna: listar todos os trabalhos que devem ser reiniciados após o patch.
Atropelei uma máquina sem PHP. Aqui está a saída:
php2shell-audit 1.1.0 - local audit
Host : admin
System : Linux 7.0.0-30-generic (x86_64)
------------------------------------------------------------------------
[UNKNOWN] No PHP installation detected.
------------------------------------------------------------------------
php.ini mitigation directives
[WARNING] session.upload_progress.enabled = (unset) (recommended 0)
[WARNING] fatal_error_backtraces = (unset) (recommended 0)
[WARNING] expose_php = (unset) (recommended 0)
------------------------------------------------------------------------
Running services that must be restarted after patching
[INFO] apache2 - 3 process(es)
------------------------------------------------------------------------
[INFO] No PHP binary, FPM daemon or Apache PHP module was found on this host.
------------------------------------------------------------------------
Remediation
[UNKNOWN] No PHP install was audited, so nothing can be confirmed safe.
Observe a última linha:Sem PHP é desconhecido, sem PASS.Este design é muito bem reconhecido -- não há problema em encontrar nada. São duas coisas diferentes.
A propósito, está ligado. expose_php Todos eles. Este não tem nada a ver com a falha em si, mas é uma decisão direta sobre se uma varredura remota pode ler o seu número de versão.Desliga isso. As impressões digitais do agressor são meio cegas.Não sei. Claro, não se chama reparação, chama-se redução da exposição à informação.
III. Parâmetros
| Parâmetros | Papel | Padrão |
|---|---|---|
--local / --remote | Dois ou um, decidimos verificar a máquina ou o alvo. | Requerido |
--file targets.txt | Lote alvo, um em uma linha, # começar com comentário | Nenhum |
--workers N | Número de cursos de longa duração | 10 |
--json report.json | Saída completa JSON,- Bater no 'stdout' | Nenhum |
--timeout N | Tempo limite de pedido único (seg) | 8 |
--insecure | Ignorar a verificação TLS, apenas para impressões digitais | Fechar |
Código de saída: direto para o ponto do cartão CI
| Código de saída | Significado |
|---|---|
0 | Nenhuma versão afetada encontrada |
2 | Pelo menos uma versão afetada foi encontrada. |
1 | Erro na própria ferramenta (por exemplo, o JSON não consegue escrever) |
Sai do número dois, este é o ponto.Isso significa que você pode colocá-lo na linha de fluxo, varrá-lo através da fase de construção, atingi-lo, e não esperar que os humanos a encontrem.
iv. Varrendo remotamente: –remote como
# 单个目标
python3 php2shell_audit.py --remote example.com
# 批量,20 个并发,出 JSON
python3 php2shell_audit.py --remote --file targets.txt --workers 20 --json out.json
# 也可以直接写在命令行里
python3 php2shell_audit.py --remote https://a.example 10.0.0.5
O quê? Escrever
# production fleet
example.com
https://shop.example.net
10.0.0.5:8080
Começa com uma nota, uma linha, uma no armazém targets.example.txt Pode ser copiado diretamente.
O que enviou?
Cada golo.Enviar apenas um pedido HEAD, apenas uma vez o servidor rejeitará o HeAD. E lê. Server:Não sei.X-Powered-By: e Set-CookieSai daí. PHP/x.y.zNão sei.
Sem multipartes, sem corpo grande, sem OOM, sem uso livre.Morreu na nota fonte como uma restrição de design.Não é aleatório.
O preço deve ser claro:Modo remoto não prova usabilidadeEle só pode relatar informações que o servidor cospe voluntariamente. Ocultar o alvo do número da versão, e o resultado será sempre UNKNOWN.
V. Como ler as conclusões
[VULNERABLE] https://shop.example.net
http : 200
server : Apache/2.4.62 (Debian)
powered : PHP/8.4.16
php : 8.4.16
verdict : PHP 8.4.16 < fixed 8.4.27
- [VULNERÁVEL] A versão foi lida e inferior à versão restaurada.
- [PASS] A versão foi lida e é maior ou igual à versão restaurada.
- [GARANDO] As instruções de atenuação provisórias não foram estabelecidas como sugerido.
- [Desconhecido] Provas insuficientes.Não é seguro, não é conhecido.
Esta distinção é onde toda a ferramenta é mais valiosa. A maioria dos scanners só dá vermelho, amarelo e verde, e então você acha que está por toda a tela.O DESCONHECIDO deve ser considerado por-fazerDesligue a versão oculta, execute no recipiente -- local, ou faça logon na máquina.
Seis, quatro buracos, um a mais do que o outro.
Tubulação 1: DESCONHECIDO
O host que escondeu o número da versão sempre relatará UNKNOWN. Certifica-te que só está no mainframe. --localNão sei.
Bolso 2: Lançamento é mal relatado.
Debian / Ubuntu / RHEL / Alpine liga regularmente em patches de segurança, masNão Saltar o Número da VersãoNão sei. O resultado é a máquina completa, como parece.
Não entres em pânico até veres o vermelho.
apt changelog php8.4
rpm -q --changelog php-8.4 | head -50
Este passo, ou não fazê-lo, seria nada mais do que uma escalada; seria também um erro de cálculo, que é a verdadeira necessidade de uma atualização.
Poço 3: Também é solicitada uma CABEÇA
Estará no diário um do outro e será escrito pela WAF. Varrer sem autorização escrita é, por natureza, uma detecção não autorizada - uma lei como a CFAA, a CMA 1990 do Reino Unido.
Preciso de autorização para limpar os bens da minha empresa.Em particular, contas intersectoriais, cross-sub-empresa, baseadas na nuvem. Não penses que "estou só a olhar para uma cabeça de resposta" não conta.
Bolso 4:-local só verificar a máquina.
O PHP é executado no contêiner, roda no contêiner ou o usa no host. --remote A porta que foi mapeada. O anfitrião corre. --local Se você não consegue encontrar o PHP no contêiner, você terá um UNKNOWN -- o UNKNOWN realmente não sabe, não o contêiner é seguro.
Seven, descobre que há um problema, e depois?
O patch é o único reparo completo.O resto está a sangrar.
# Debian / Ubuntu
sudo apt update && sudo apt install --only-upgrade php
# RHEL / Fedora
sudo dnf upgrade 'php*'
# Alpine
sudo apk upgrade php83 php84
Atualização: 8.2 ramificação para 8.2.358.3 a 8.3.36É 8.4. 8.4.27São 8.5. 8.5.12Não sei. 8.1 e mais além, apenas relatório de nível de fonte.
Se não conseguir um remendo, faça isto primeiro e comece tudo de novo.
; CVE-2026-109619
session.upload_progress.enabled = 0
; CVE-2026-109618
memory_limit = -1
; 仅 PHP 8.5
fatal_error_backtraces = 0
session.upload_progress.enabled=0Para ser escrito em php.ini, ferramenta FPM ou configuração do servidor,Tem de ser eficaz antes do pedido.Não sei. É tarde demais.memory_limit=-1Preciso dele.php_admin_valueA configuração de nível de tais aplicações é inalterada, garantindo ao mesmo tempo que não existe nenhum pool/ directório/ aplicação para restaurar o valor limitado.- Nunca utilize RLIMIT AS ou RLIMIT DATAAqueles dois vão fazer o Map falhar e voltar a entrar naquele perigoso caminho Longjmp.
- A mudança deve reiniciar cada trabalhador:
systemctl restart php*-fpm apache2 nginxNão sei.Nenhuma reinicialização é nenhuma alteração.
Nenhum destes quatro pode torná-lo seguro, e as próprias autoridades são bastante claras. Eles têm apenas um valor:Antes de o remendar, cubra a porta.
VIII. Uma sequência completa
- Verifica-te primeiro.:
--localTrês ou cinco segundos, veja a versão e a configuração. - Varredura de lote remotaÉ importante.
--remote --fileE foge do JSON. - Processamento de classificação: Atualizações VOLNERÁVEIS, reabastecimento ATENÇÃO, identificação desconhecida --Não está fechado, é para ser feito.
- Actualização + Reiniciar o Trabalhador: Patches, e então reiniciar todos os FPM/ Apache/ nginx.
- Refazer a Autenticação: Corra novamente, confirme verde. Assista ao erro de backport e observe changelog, se necessário.
- Entra na linha de água.: Quit Code 2 Construção de falha direta, e da próxima vez ninguém vai se lembrar.
Todo o processo é de dez minutos, e o tempo real é o terceiro passo.Verifica as linhas desconhecidas.Não sei. Mas isso não vai salvá-lo, porque, ao não o fazer, recebes um belo, falso, relatório verde.
O valor do scanner não está a dar-te luz verde, está a forçar-te a admitir onde não sabes.
Repetir o endereço do projeto:Gythub.com/viviopenclaw-code/php2shell-uditNão sei. Leia DISSLAIMER.md antes de ser escrito em chinês.
Última frase me lembra que esta ferramenta é 1.1.0 hoje, a primeira versão pública, um único garfo zero, um pequeno número de códigos, você pode lê-los todos. php2shell_audit.pyNão sei.Olha para o código-fonte., especialmente se você quiser ler o php.ini e a lista de processos com permissão do administrador.