On May 19, 2026, I reported an unauthenticated SQL injection in an externally reachable SOAP integration. Four months later, the case closed with an Exceptional (10.0) rating and a €5,000 total bounty, shared with a collaborator.

The final remediation was to turn off the server. The company explained that it was no longer used, even though my testing had linked it to the main website’s production database.

Between discovery and resolution, one request appeared to stop working while another operation on the same server continued to expose the problem. Following up on those operations kept the investigation moving until the company retired the service.

At a glance

Item Outcome
Vulnerability Unauthenticated SQL injection in SOAP integration services
Database technology Microsoft SQL Server
Reported May 19, 2026
Final program rating Exceptional, 10.0
Total bounty €5,000 across both collaborators
Resolution September 24, 2026; server switched off, according to the company

Reconnaissance: from an indexed IP to SOAP services

I started with a hostname search in Shodan, scoped to the company’s domain. That led me to an indexed IP address associated with the organization.

From there, I used shortscan for IIS short-name enumeration.

Anonymized shortscan output showing IIS short-name enumeration, with the target IP redacted and organization-specific prefixes replaced.
Shortscan discovery screenshot, anonymized for publication. The IP is redacted, and COMPANY-prefixed entries are substituted labels rather than literal short names. Select the image to view it at full size.

I followed that with ffuf and the iis.txt wordlist, looking for paths that shared a service-name prefix. This narrowed the search to the integration services that became the focus of the report.

Anonymized ffuf path-discovery output showing candidate paths returning redirects, with the IP redacted and the URL prefix replaced with COMPANY.
ffuf path-discovery screenshot, anonymized for publication. The IP is redacted and the organization-specific URL prefix is replaced with COMPANY. Several candidates returned redirects; these results guided further service review. Select the image to view it at full size.

When I visited those directory hits in the browser, they returned 403 Forbidden. I ran shortscan again inside one of the discovered directories, which revealed short-name hints for a service file.

Anonymized shortscan output inside a discovered directory, showing a service-file short-name hint and a service references directory.
The second shortscan run, inside a discovered directory. The IP is redacted and company-specific prefixes are replaced; WSCOMPANY entries are substituted labels. The output provided filename hints for the next stage of investigation. Select the image to view it at full size.

The ASMX service name followed the same naming pattern as its parent directory. Opening that service brought up an operations index, which led me to the documentation for the email-change operation.

The discovery sequence was:

Stage Tool Purpose
Public indexing Shodan Find an IP associated with the company’s hostnames
IIS enumeration shortscan Look for short-name hints on the exposed IIS surface
Path discovery ffuf with iis.txt Identify service paths using a prefix relevant to the target
Directory follow-up shortscan Find service-file hints inside directories that returned 403 when visited
ASMX documentation Browser Review the matching service’s operation index and request/response schema
Service review SOAP request and response inspection Understand the exposed operations and their behavior

The company domain, IP address, and service-path prefix are redacted in this writeup. The discovery tools identified where to look; the subsequent application responses supplied the evidence for the SQL injection.

An integration service with database access

The ASMX service page listed the supported operations, including the email-change functionality I investigated.

ASMX service documentation listing its supported operations, with the company-specific service name replaced.
The service's operations index, with the company-specific service name anonymized. Select the image to view it at full size.

The first finding involved an email-change operation exposed through a SOAP service. It accepted requests without credentials or a logged-in browser session.

SOAP was the transport layer: an XML envelope carried the operation and its input. The security issue appeared further down the request path, where that input influenced a database query.

ASMX documentation for the email-change operation, showing example SOAP request and response schemas with the IP and company-specific service identifiers anonymized.
The operation's generated SOAP documentation. These request and response examples contain placeholder values and describe the service contract. The IP and company-specific service identifiers are anonymized. Select the image to view it at full size.

Unexpected input produced Microsoft SQL Server parsing errors in the response, including an unclosed quotation-mark error. That was a useful signal, but a parsing error alone did not establish the extent of the issue.

I did not have the server-side source code. Unsafe construction of SQL statements was an inference from the responses, rather than something I confirmed by reading the implementation.

Building evidence beyond the first error

The report described several distinct observations: database parsing failures, changes in application behavior, and retrieval of limited database metadata. Together, those supported the SQL injection finding more strongly than an isolated error message.

The important distinction was between influencing a query and proving every possible consequence of that influence.

Evidence in the report history What it supported What it did not establish
SQL Server parsing details returned to the caller User input was reaching SQL processing unsafely; internal error details were exposed The amount of data an attacker could access
Changes in application processing after controlled input changes Input affected database-dependent behavior That a downstream error itself contained customer data
Database metadata returned or inferred from the responses The issue went beyond a simple malformed-request error A complete customer-database dump
My own newly created website account was linked to the data under investigation A connection to data used by the main website The identity or contents of every reachable table

I reported limiting data collection to database metadata, a record count, and verification involving my own test account. I did not dump customer records.

My test-account check linked the integration to the main website’s production data. The count I reported was 12,904,334 rows—roughly 13 million records. That row count did not establish how many distinct users were represented.

The report discussed broader risks to customer information and possible data modification. Those were impact scenarios. The evidence I am presenting here supports unauthenticated query manipulation and database metadata disclosure; it does not demonstrate arbitrary modification, deletion, or access to every category of payment data.

Triage and follow-up evidence

Intigriti reproduced the finding on May 19 and passed it to the company. My test-account check also linked the exposed integration to data associated with the main website.

The follow-up evidence concerned a product-related operation on another SOAP service on the same server. This was a different operation from the initial email-change finding.

That distinction matters. A request being rejected, or one route no longer behaving as before, does not show that every affected operation on the server has been addressed. It also does not establish why the original request stopped working.

During the June review, triage asked for evidence beyond a syntax error. I supplied further database metadata evidence for the product operation. On June 4, triage confirmed reproduction and passed the evidence to the company. The program record listed the severity as Exceptional (10.0).

That was the program’s recorded rating. My initial assessment was CVSS 3.1 9.1.

The September retest

On September 22, the discussion resumed with the understanding that the issue had previously been solved. My retest notes showed that the product operation still exhibited the reported behavior.

The comparison was clear at the application level. A baseline request returned an empty result with a success status. Other controlled inputs led to a downstream-service exception or SQL Server parsing details, including fragments of the constructed query.

The September 24 notes also recorded that both the baseline and error responses used HTTP 200. The application-level status and response body carried the distinction. Watching the HTTP status alone would have hidden it.

The company then asked for a complete SOAP request to help reproduce the behavior. I supplied the request context alongside the baseline and observed response differences. No credentials or cookies were needed for those recorded tests.

The company accepted the report on September 24 and awarded the €5,000 total bounty.

Resolution: the server was retired

Later that day, the company explained that the server was no longer used and had been turned off. The report moved to Resolved.

That is the documented remediation for this case. I do not have a source-code patch to describe, and the report history does not establish that all of the affected query implementations were rewritten.

The outcome highlighted a service-lifecycle problem: a server could be unnecessary to the business and still remain reachable with a connection to production data. My test-account check and the reported count of roughly 13 million records made that access significant. Retirement removed the reported service from exposure.

Timeline

Date Event
May 19, 2026 Finding reported; triage reproduced it the same day.
May 20 I explained the link to my main-site test account.
June 3 Further database metadata evidence supplied for the product operation.
June 4 Triage confirmed reproduction; the program record listed Exceptional, 10.0.
September 22 Product-operation retest evidence showed the issue was still observable.
September 24 Further reproduction details supplied; report accepted and €5,000 total bounty awarded.
September 24 The company reported switching off the unused server and marked the report Resolved.

What I took from it

Make the evidence easy to evaluate. A database error is a starting point. The stronger report explains what changed, what the response establishes, and where the demonstrated impact stops. A complete request context also saves time when the reviewer is less familiar with the protocol.

Track operations individually during retesting. In this case, the original email-change finding and the later product-service evidence belonged to the same investigation, but they were different request paths. Keeping that distinction visible made the remediation discussion more precise.

For an integration that needs to remain in service, the database defense is to bind user values through parameterized queries and restrict the application’s database permissions. Those are established recommendations in the OWASP SQL Injection Prevention Cheat Sheet. Detailed database exceptions should also stay out of public responses, although hiding them alone would not fix unsafe query construction.

For this server, the company chose retirement. Keeping an accurate inventory of exposed integrations—and removing them when they are no longer needed—was the operational lesson behind the final resolution.

Thanks to my collaborator for helping with the case, and to the triage team and the company for working through the report and resolving the exposure.