Skip to content

CVE-2023-48788 — Fortinet FortiClientEMS SQL Injection

Key facts

CVE-2023-48788 is a Critical (9.8) vulnerability: Fortinet FortiClientEMS SQL Injection. This entry ships ready-to-deploy detection and prevention rules (Snort, YARA, Nginx, Apache) plus a detection-only PoC and a Docker test lab. It is on the CISA Known Exploited Vulnerabilities (KEV) catalog (added 2024-03-25), confirming active exploitation in the wild, and is linked to known ransomware campaigns.

Actively exploited — on the CISA KEV catalog

CVE-2023-48788 is listed on the CISA Known Exploited Vulnerabilities (KEV) catalog (added 2024-03-25), confirming exploitation in the wild. It is linked to known ransomware campaigns. Federal remediation deadline: 2024-04-15. Prioritise patching and deploy the detection and prevention rules below.

CVE CVE-2023-48788
Severity Critical (9.8)
CISA KEV Actively exploited (added 2024-03-25) · ransomware
Product Fortinet FortiClientEMS
Detection / prevention Snort, YARA, Nginx, Apache
PoC poc.py
Source 2023/CVE-2023-48788/

Details

CVE-2023-48788 (Fortinet FortiClientEMS) is a Critical (9.8) vulnerability: Fortinet FortiClientEMS SQL Injection. This entry ships a detection-only proof-of-concept (PoC), a Docker test lab, and ready-to-deploy detection and prevention rules (Snort, YARA, Nginx, Apache) — see Detection and prevention below. Source: NVD record.

Attribute Value
CVE ID CVE-2023-48788
CVSS Score 9.8
Product Fortinet FortiClientEMS
Type SQL Injection

Description

SQL injection vulnerability in FortiClientEMS allowing unauthenticated attackers to execute commands via crafted requests.

Affected Versions

  • FortiClientEMS 7.0.1 - 7.0.10
  • FortiClientEMS 7.2.0 - 7.2.2

Mitigation

  1. Upgrade to FortiClientEMS 7.0.11 or 7.2.3
  2. Restrict network access
  3. Monitor for SQL injection attempts

Verification Process

The PoC uses a multi-stage verification approach:

Step 1: Product/Version Detection (Passive)

[*] Query target endpoint
[*] Detect product signatures and extract version
[*] Check if version is in vulnerable range

Step 2: Active Vulnerability Testing

Method Description Detection
Error-based Tests for error messages indicating vulnerability Error indicators in response
Timing-based Measures response delay with payload Response time significantly longer
Response-based Checks for expected patterns in response Vulnerability indicators present

Verification Flow

┌─────────────────────────────────────────────────────────────┐
│                    Product Detection                         │
│  Query target → Detect product/version                      │
│  Check if version in vulnerable range                       │
└─────────────────────────────────────────────────────────────┘
                              ↓
┌─────────────────────────────────────────────────────────────┐
│               Active Vulnerability Testing                   │
│                                                              │
│  1. Error-based Test                                         │
│     └─ Send payload → Check for error indicators            │
│     └─ If error found → CONFIRMED VULNERABLE                │
│                                                              │
│  2. Timing-based Test                                        │
│     └─ Send delay payload → Measure response time           │
│     └─ If delayed → CONFIRMED VULNERABLE                    │
│                                                              │
│  3. Response-based Test                                      │
│     └─ Send payload → Check response content                │
│     └─ If pattern matches → CONFIRMED VULNERABLE            │
└─────────────────────────────────────────────────────────────┘

Usage

# Full vulnerability check (version + active testing)
python3 poc.py -t https://target.com -c

# Version-only check (passive, no payloads sent)
python3 poc.py -t https://target.com -c --version-only

References

Detection and prevention

Ready-to-deploy defensive rules for CVE-2023-48788, for authorized testing and blue-team detection engineering:

References: NVD — CVE-2023-48788 · full write-up on the searchable site

Detection & prevention rules

# CVE-2023-48788 - Snort IDS Rules
# Severity: High

# Detect potential exploit attempts
alert tcp $EXTERNAL_NET any -> $HOME_NET $HTTP_PORTS (
    msg:"CVE-2023-48788 Potential Exploit Attempt";
    flow:to_server,established;
    content:".."; http_uri;
    classtype:web-application-attack;
    sid:2023487881;
    rev:1;
    metadata:cve CVE-2023-48788, severity high;
)

# Detect suspicious patterns in request
alert tcp $EXTERNAL_NET any -> $HOME_NET $HTTP_PORTS (
    msg:"CVE-2023-48788 Suspicious Request Pattern";
    flow:to_server,established;
    pcre:"/(%2e%2e|%252e|\x00)/Ui";
    classtype:web-application-attack;
    sid:2023487882;
    rev:1;
    metadata:cve CVE-2023-48788, severity high;
)

:material-file-download: prevention/snort.rules

/*
 * CVE-2023-48788 - YARA Detection Rules
 */

rule CVE_2023_48788_Exploit {
    meta:
        description = "Detects potential CVE-2023-48788 exploit attempts"
        author = "Security Research Team"
        severity = "high"
        cve = "CVE-2023-48788"

    strings:
        $path_traversal1 = "../" ascii wide
        $path_traversal2 = "..\" ascii wide
        $encoded1 = "%2e%2e" ascii wide nocase
        $encoded2 = "%252e" ascii wide nocase
        $null_byte = "%00" ascii wide

    condition:
        any of them
}

:material-file-download: prevention/yara.yar

# CVE-2023-48788 - Prevention Rules for Nginx

# Block common exploit patterns
location / {
    # Rate limiting
    limit_req zone=general burst=20 nodelay;

    # Block suspicious patterns
    if ($request_uri ~* "(\.\.[\/]|%2e%2e|%252e)") {
        return 403;
    }

    # Security headers
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-Frame-Options "DENY" always;
    add_header X-XSS-Protection "1; mode=block" always;
}

# Log suspicious activity
access_log /var/log/nginx/CVE-2023-48788-access.log;
error_log /var/log/nginx/CVE-2023-48788-error.log;

:material-file-download: prevention/nginx.conf

# CVE-2023-48788 - Prevention Rules for Apache httpd

# Block common exploit patterns
<IfModule mod_rewrite.c>
    RewriteEngine On

    # Block path traversal
    RewriteCond %{REQUEST_URI} (\.\.[\/]|%2e%2e|%252e) [NC]
    RewriteRule .* - [F,L]

    # Block null bytes
    RewriteCond %{REQUEST_URI} %00 [NC]
    RewriteRule .* - [F,L]
</IfModule>

# Security headers
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "DENY"
Header always set X-XSS-Protection "1; mode=block"

# Enable logging
CustomLog /var/log/httpd/CVE-2023-48788-access.log combined
ErrorLog /var/log/httpd/CVE-2023-48788-error.log

:material-file-download: prevention/httpd.conf

Frequently asked questions

What is CVE-2023-48788?

CVE-2023-48788 is a Critical (9.8) vulnerability: Fortinet FortiClientEMS SQL Injection. This entry ships ready-to-deploy detection and prevention rules (Snort, YARA, Nginx, Apache) plus a detection-only PoC and a Docker test lab. It is on the CISA Known Exploited Vulnerabilities (KEV) catalog (added 2024-03-25), confirming active exploitation in the wild, and is linked to known ransomware campaigns.

How do I detect CVE-2023-48788?

Deploy the Snort and YARA detection rule included with this entry (see Detection & prevention rules below), then validate it against the detection-only PoC in the Docker test lab.

How do I block or mitigate CVE-2023-48788?

Apply the Nginx and Apache mitigation config included with this entry, and upgrade to a fixed version per the vendor advisory (see the NVD record for affected versions).

Is CVE-2023-48788 actively exploited?

Yes. CVE-2023-48788 is on the CISA Known Exploited Vulnerabilities (KEV) catalog, added 2024-03-25, which means it has been exploited in the wild. CISA also links it to known ransomware campaigns. CISA set a federal remediation deadline of 2024-04-15. Prioritise patching and deploy the detection and prevention rules above.


For authorized security testing and research only. See the full source and NVD record.