Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
The server expects two values (one and two) passed in as a JSON array.
It appends a secret to the start of both of these and runs them through a custom hashing function.
If the result is equal, we get the flag. However, our input is compared with the === operator, and if they match our input is rejected.
As this is a web challenge, not a crypto one, I realized the target was not the hashing function.
After some playing around, I found that ['a'] === ['a'] returns false, likely because the arrays are two different objects in memory.
We send to the server:
{
"one":["a"],
"two":["a"]
}and the flag is returned.
Earlier on, I noticed the path /__adminPortal in an undefined response header.
Now with admin access, I decided to visit it.
It gave us some nice ASCII art, but in a hidden <p> there was some Zalgo'd text.
Using a Zalgo Remover , I retrieved the original text: Lorem Ipsum, but hidden inside:
<!-- In case I forget: Backup password is at ./backup.txt -->The next stage of the Quarantine series.
I noticed that our session cookie was a JWT, signed with HS256.
A vulnerability exists where these tokens can have their signing algorithm set to 'none' and their signature removed, and the web app will accept and process it.
I used the highly useful jwt_tool to resign it, editing my 'privilege' value from '1' to '10'.
This allowed me access to the admin panel (more of a single page).
If we log in with the credentials from Entrypoint, we can see a list of users.
One of these is called "loginToGetFlag", so we'll try to log into this one.
We get a SQL error if we put a ' so we can try SQL Injection payloads.
We can use the payload:
loginToGetFlag' --
to log into this user - and we get the flag.
This is the same principle as Baiting. This time we need to log into the admin user.
From the list of users we found with the devloper credentials, jimmyTehAdmin is the account we need to log in to.
We can use a similar payload to before (this challenge is more resitant to SQLMap)
' OR username='jimmyTehAdmin' --
We are presented with a login page. As this was a low-rated challenge, I began by testing basic SQLi.
Entering ' or 1=1; -- - in the username field returned the message 'You are trying to login as multiple users'.
From this, I determined that the injection was sucessful, but as this query returned multiple users the web app was rejecting it.
I simply edited the payload to be ' or 1=1 limit 1; -- -, and I got access
Same concept as Entrypoint, but a different file.
We are told that it is running on a Python server,
so we can try to include common python web app filenames, such as app.py and main.py.
If we use the same method as Entrypoint and go to /static?f=main.py, and we get the flag.
We are given the name of the source code file app.py, and we need to find a way to read it.
We already have access to the admin section of the site from the previous challenge.
We are given links to three available videos that we can watch.
These all follow the format /watch/XXXX.mp4.
We are told the name of the file we need to read is called app.py
So we can try /watch/app.py.
In the source code of the page, we can see:
data:video/mp4;base64,ractf{qu3ry5tr1ng_m4n1pul4ti0n}