This is like finding the janitor’s key cabinet unlocked, but only in buildings someone misconfigured first
Tenable plugin 121479 is not a product-version bug so much as a *live exposure check*: the scanner was able to request web.config over HTTP and determined the server might return configuration data instead of blocking it. On ASP.NET / IIS stacks, web.config can contain sensitive material such as connectionStrings, appSettings, module settings, and occasionally plaintext or decryptable secrets. Tenable published the plugin on 2019-01-30 and scores it CVSS 5.3 / Medium with vector CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N.
In practice, vendor *Medium* is a little generous for fleet-wide prioritization because modern IIS normally treats web.config as a protected hidden segment, so reachable exposure usually implies a local app/server misconfiguration, a reverse-proxy edge case, or a nonstandard file-serving path. The finding still matters on any host where it is confirmed, because the next step can be credential theft and pivoting, but the reachable population is narrow and the direct impact is read-only unless the leaked config contains reusable secrets.
4 steps from start to impact.
Probe the site with curl or Burp
/web.config or variant paths through a browser, curl, Burp Suite, or ffuf-style content discovery. This is trivial and unauthenticated if the web app is externally reachable.- The application must be reachable over HTTP(S)
- The attacker must know or guess the app root path
- Most IIS deployments deny requests to
web.configby default - WAFs, reverse proxies, or path normalization often block obvious probes
web.config.Bypass missing or broken request filtering
- IIS hidden-segment protection or equivalent control is absent, bypassed, or broken
- The file is present in the served path
- Default IIS behavior is defensive here
- Some findings are false positives when the response is an error wrapper or sanitized XML fragment
Mine the file for reusable secrets
connectionStrings, service credentials, machine keys, SMTP credentials, API endpoints, or environment-specific details. Burp, simple XPath parsing, or grep is enough; no weaponized exploit framework is needed.- Sensitive values must actually be stored in
web.config - Leaked values must be valid and not separately protected
- Many shops encrypt sensitive config sections
- Some modern apps keep secrets in vaults, environment variables, or managed identities instead
Pivot with leaked credentials or application insight
- The returned config contains live credentials or signing material
- Those credentials are accepted by downstream systems
- Credential rotation, least privilege, network segmentation, and MFA can contain the blast radius
- Leaked values may be stale or scoped to noncritical services
The supporting signals.
| In-the-wild status | No CVE is attached to this Tenable check, and I found no authoritative evidence of active exploitation campaigns tied to this specific issue class. |
|---|---|
| KEV status | Not KEV-listed / not applicable. CISA KEV tracks named CVEs; this plugin is a misconfiguration-style exposure check rather than a mapped CVE. |
| PoC availability | Trivial PoC: a plain GET /web.config with curl, Burp Suite, or any web scanner. No notable named exploit repo is required. |
| EPSS | N/A because EPSS applies to CVEs and this finding has no mapped CVE. |
| CVSS baseline | Tenable scores it 5.3 / Medium with CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N, which models anonymous low-complexity confidentiality loss but ignores how rarely default IIS exposes web.config. |
| Affected scope | Potentially any ASP.NET / IIS-hosted application where web.config is web-accessible because of request-filtering, routing, proxy, or static-file misconfiguration. There is no vendor version range to patch. |
| Fixed state | There is no patched version. The secure state is configuration-based: IIS request filtering / hidden segments block access, and sensitive config sections should be encrypted or moved out of web-reachable paths. |
| Exposure population | Real-world reachable population is likely small because Microsoft documents hiddenSegments and request filtering as standard controls, and IIS commonly blocks requests to web.config by default. |
| Detection quality | Discovery coverage is high because this is easy to scan remotely, but validation quality varies: confirm the exact response body to separate true disclosure from error-page noise. |
| Disclosure timeline | Tenable plugin published 2019-01-30, updated 2020-04-27. This is longstanding defensive hygiene, not a newly disclosed software flaw. |
noisgate verdict.
The decisive factor is reachability friction: a successful disclosure usually means the site is already misconfigured away from normal IIS protections, so the exposed population is much smaller than the CVSS baseline suggests. Impact can rise fast if secrets are present, but the base condition is still a narrow configuration failure rather than a mass-exploitable product bug.
Why this verdict
- Downgrade for default protection: IIS commonly blocks
web.configthrough request filtering / hidden segments, so successful exploitation presumes nondefault server or routing behavior. - Downgrade for exposure population: this is not a broadly versioned software flaw; it only exists on the subset of apps where the file is actually web-reachable.
- Keep it above IGNORE: if the scanner truly retrieved the file, a no-auth remote attacker may immediately harvest credentials, connection strings, or machine keys and pivot.
Why not higher?
There is no evidence here of active exploitation, no KEV entry, and no broad one-to-many version defect requiring emergency fleet patching. The attacker must hit a host that is both externally reachable and locally misconfigured to serve a file IIS usually protects.
Why not lower?
This is not harmless noise if confirmed. A single exposed web.config can reveal secrets that convert a read-only bug into database access, tenant compromise, or lateral movement, so it deserves remediation rather than documentation-only treatment.
What to do — in priority order.
- Block direct access to
web.config— Enforce IIS request filtering / hidden segments and verify upstream proxies, CDN rules, and static-file handlers do not override that behavior. For a LOW verdict there is no SLA-backed mitigation deadline, but this is simple hardening and should be folded into normal backlog hygiene promptly. - Review returned content for secrets — If Tenable or manual testing confirms disclosure, inspect the exposed file for
connectionStrings, API keys, SMTP creds, machine keys, and internal URLs so you know whether this is merely metadata leakage or a credential incident. For LOW, there is no mitigation SLA, but triage the secret exposure before closing the ticket. - Encrypt or externalize sensitive config — Use protected configuration, a secrets vault, or managed identity patterns so that even accidental file disclosure yields little reusable material. This reduces blast radius permanently and should be handled in normal remediation work for LOW findings.
- Hunt for direct requests in logs — Search IIS, reverse proxy, and WAF logs for
GET /web.configand encoded variants to identify whether anyone probed the exposure before remediation. This is low-cost verification and helps decide whether credential rotation is warranted.
- Relying on HTTPS alone does not help; TLS protects transit, not the fact that the server is willingly serving a sensitive file.
- Treating this as a patch-only problem does not work because there is usually no vendor patch or fixed version to deploy.
- Assuming WAF coverage is sufficient is weak; if the origin or proxy path serves the file on a normal request, not every deployment will catch every path variant.
Crowdsourced verification payload.
Run this from an auditor workstation or directly on the IIS host against the exact application URL that Nessus flagged. Invoke it with powershell -ExecutionPolicy Bypass -File .\check-webconfig.ps1 -Url https://app.example.com/; no admin rights are required because this validates the issue remotely by HTTP response.
param(
[Parameter(Mandatory=$true)]
[string]$Url
)
# check-webconfig.ps1
# Purpose: Test whether /web.config is remotely accessible.
# Exit codes:
# 0 = PATCHED
# 1 = VULNERABLE
# 2 = UNKNOWN
$ErrorActionPreference = 'Stop'
function Write-Result {
param(
[string]$State,
[int]$Code,
[string]$Detail
)
Write-Output ($State + ': ' + $Detail)
exit $Code
}
try {
if (-not $Url.StartsWith('http://') -and -not $Url.StartsWith('https://')) {
Write-Result 'UNKNOWN' 2 'URL must start with http:// or https://'
}
$base = $Url.TrimEnd('/')
$target = $base + '/web.config'
$response = Invoke-WebRequest -Uri $target -Method GET -MaximumRedirection 5 -UseBasicParsing -TimeoutSec 20 -Headers @{
'User-Agent' = 'noisgate-webconfig-check/1.0'
'Accept' = '*/*'
} -SkipHttpErrorCheck
$status = [int]$response.StatusCode
$body = ''
if ($null -ne $response.Content) { $body = [string]$response.Content }
$bodySample = $body.Substring(0, [Math]::Min($body.Length, 400))
$looksLikeConfig = $false
if ($body -match '<configuration[\s>]' -or
$body -match '<appSettings>' -or
$body -match '<connectionStrings>' -or
$body -match '<system\.web' -or
$body -match '<system\.webServer') {
$looksLikeConfig = $true
}
if ($status -eq 200 -and $looksLikeConfig) {
Write-Result 'VULNERABLE' 1 ("HTTP 200 and response looks like web.config from $target")
}
if ($status -in 401,403,404,4048,500) {
Write-Result 'PATCHED' 0 ("Received blocking/non-content status $status from $target")
}
if ($status -eq 200 -and -not $looksLikeConfig) {
Write-Result 'UNKNOWN' 2 ("HTTP 200 but content does not resemble web.config. Sample: $bodySample")
}
Write-Result 'UNKNOWN' 2 ("Unexpected HTTP status $status from $target")
}
catch {
Write-Result 'UNKNOWN' 2 $_.Exception.Message
}
If you remember one thing.
web.config is not web-readable, and review any exposed file for live secrets; because this is LOW, there is no noisgate mitigation SLA and noisgate remediation SLA is backlog hygiene, but if any returned config contains valid credentials or machine keys, escalate that individual asset immediately as an incident and rotate the affected secrets the same day.Sources
- Tenable Plugin 121479
- Microsoft Learn - Hidden Segments
- Microsoft Learn - Configure Request Filtering in IIS
- Microsoft Learn - web.config file for ASP.NET Core on IIS
- Microsoft Learn - Protecting Connection Strings and Other Configuration Information
- OWASP WSTG - Review Old Backup and Unreferenced Files for Sensitive Information
- OWASP WSTG - Test File Extensions Handling for Sensitive Information
- CISA Known Exploited Vulnerabilities Catalog
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.