Excessive trust in client-side controls | Dec 19, 2022
Introduction
Welcome to my another writeup! In this Portswigger Labs lab, you’ll learn: Excessive trust in client-side controls! Without further ado, let’s dive in.
- Overall difficulty for me (From 1-10 stars): ★☆☆☆☆☆☆☆☆☆
Background
This lab doesn’t adequately validate user input. You can exploit a logic flaw in its purchasing workflow to buy items for an unintended price. To solve the lab, buy a “Lightweight l33t leather jacket”.
You can log in to your own account using the following credentials: wiener:peter
Exploitation
Home page:
Login as user wiener
:
Let’s go to the /cart
page:
As you can see, we only have $100
store credit.
In the lab background, we need to buy the product Lightweight l33t leather jacket
:
Let’s click view detail
:
Now, we can click the Add to cart
button, and intercept the request via Burp Suite:
When we clicked that button, it’ll send a POST request to /cart
with parameter: productId=1
, redir=PRODUCT
, quantity=1
, and price=133700
.
Let’s forward that request, and go to /cart
page:
In here, we see that the product has been added to our cart.
Let’s try to click Place order
button:
When we clicked the Place order
button, it’ll send a POST request to /cart/checkout
with a parameter csrf
.
Let’s forward that request and see what will happen:
When we don’t have enough store credit to buy a product, it’ll send a GET request to /cart
with parameter err
, and it’s value is INSUFFICIENT_FUNDS
.
To exploit the application logic flaw, we need to Remove
the product first:
When we clicked the Remove
button, it’ll send a POST request to /cart
, with parameter productId=1
, quantity=-1
, redir=CART
.
It seems like the parameter redir
is redirecting to which page, like /cart
for example.
Now, let’s go back to the product Lightweight l33t leather jacket
page:
Hmm… What if I set the price to 100($1.00)?
Let’s modify and forward the request:
Then go to /cart
page:
As we can see, that price changed from $1337.00
to $1.00
!!
Let’s click the Place order
button:
There is no error anymore!
And we successfully purchased that product!
What we’ve learned:
- Excessive trust in client-side controls