security research
iltosec
← back to blog
Business logic Web Application Security enumeration payment security

From Good Disclosure to Silence, A Business Logic Price Manipulation Story

Introduction

In 2022, as a regular customer of an e-commerce platform, I came across a couple of stored XSS issues and a minor business logic flaw while browsing the site. I reported them directly to the company. The response was fast, the fixes landed quickly, and they even thanked me with an invite for coffee, I couldn't make it since we were in different cities, but the whole process was a good example of how vendor communication should work.

In 2023, on the same platform, I found something considerably more serious.

All testing described here was performed as a regular, unauthenticated customer interacting with the publicly available checkout flow, no credentials or internal access were used beyond a normal shopping session. The vulnerability has since been fixed. Company name, domain, and any identifying details have been redacted throughout; the domain is referred to as xyz.com and field names have been generalized.


Finding: Client-Side Price Enforcement in the Checkout Flow

While going through the checkout process as a guest, I noticed that after entering shipping and billing information, the request that submitted the order also carried the order's total amount as a plain, client-editable form field.

A simplified, redacted version of the intercepted request looked like this:

POST /payment-guest HTTP/2
Host: xyz.com
Cookie: ci_session=<redacted>
Content-Type: application/x-www-form-urlencoded

firstName=a&lastName=a
...
&consentAccepted=1&toplam_tutar=280

The toplam_tutar field was accepted as-is, with no server-side recalculation based on the actual cart contents or listed product price. Changing it in transit, for example, it was enough to reduce the total amount from total_amount=280 to total_amount=1 and send the request.

image

image

image

The platform used iyzico as its payment service provider. Right after the tampered request above, the checkout flow made a follow-up call to iyzico's own API to generate the installment/checkout form, and the tampered value carried straight through:

POST /payment/iyzipos/checkoutform/installment HTTP/1.1
Host: api.iyzipay.com
Referer: https://xyz.com/
Content-Type: application/json
X-Iyzi-Token: <redacted>

{
  "price": 1
}

image
From there, the flow proceeded exactly like a normal payment: entering card details triggered the standard 3-D Secure verification, and a one-time SMS confirmation code was sent to the phone number tied to the card, for a transaction of 1 TRY instead of the actual 280 TRY order value. The payment was not completed beyond this point, but the OTP request itself confirms the tampered amount had already reached the real payment gateway as a genuine, processable transaction, not just a client-side display value.

image

image

This is a textbook example of client-side enforcement of a security-relevant value (CWE-602): the server trusted a number the client was free to change, instead of treating the client as untrusted input and recalculating the authoritative price itself.


Impact


Disclosure Timeline

Date Event
May 2023 Vulnerability reported directly to the company, with a written explanation and a video walkthrough of the issue
June 2023 Company acknowledged the report, confirming it had been forwarded to the development team
June 2023 Vulnerability fixed on the live site
June 2023 Follow-up sent noting the fix, and asking whether a reward could be considered, since the company had no formal bug bounty program at the time, unlike some of its peers
June 2023 Second follow-up sent, three weeks after the original report, noting that no communication had been received since the fix
June 2023 No further response was ever received

The contrast with the 2022 experience is what makes this worth writing about. While the vulnerability was open, communication was quick and cooperative. The moment it was patched, and once a reward was asked for, communication stopped entirely, no "thank you," no decision on the request, no closing message, nothing.

This isn't a one-off. It's a pattern some organizations fall into: engagement with a researcher lasts exactly as long as the researcher is perceived to hold leverage. Once the risk is gone, so is the courtesy.


Remediation


Closing Thoughts

Vulnerability research is, more often than not, unpaid and voluntary. A short, genuine "thank you" once an issue is fixed costs a company nothing and is the cheapest investment it can make in keeping researchers willing to report the next one, ignoring that costs more than it seems.


References

found this useful?
share on x ↗