This lab cannot reach the internet, so a server of your own is not reachable from it. Anything the shop addresses to a host that is not its own is captured here instead, written the way it would have arrived in that server's access log. Nothing is ever actually sent.
21 real issues are hiding in this shop โ the kind that turn up on ordinary engagements. Nothing to submit: exploit one and it confirms itself.
Information disclosure 0/4
Files a deploy left behind. Always the first thing to look for.
Environment file served to anyoneHigh
Find the file holding the live database password and API keys.
Stuck? Show a hint
Sloppy deploys leave the app config in the web root. It is one file, its name starts with a dot, and every framework uses the same one.
Deployment notes with working credentialsHigh
Find the leftover install notes and get a set of staff credentials out of them.
Stuck? Show a hint
Think about what a developer drops in the web root while setting a site up and forgets to delete. A plain text file with a name like install, setup or notes.
Admin login page reachable from the internetMedium
Find the staff login. Nothing on the shop links to it.
Stuck? Show a hint
The file that tells search engines what to skip is a list of the paths the owner did not want found.
Site backup downloadableCritical
Download the backup archive and read what is inside it.
Stuck? Show a hint
Same idea as the notes file. Backups get written into the web root and left there โ try the obvious archive names.
Broken access control 0/4
Four different ways into an account that should not be yours.
Default credentials on the admin panelCritical
Sign in to the staff panel without stealing anyone's password.
Stuck? Show a hint
Before guessing anything clever, try what the software shipped with. The most tired username and the most tired password.
Staff access granted by email domainCritical
Register a brand new account that comes out with staff rights instead of customer rights.
Stuck? Show a hint
The site decides who works here by looking at the address you sign up with. Nothing checks that you can actually receive mail there. The company domain is in the leaked config.
Account role accepted from the requestCritical
Make an ordinary account into an admin by changing what the browser sends.
Stuck? Show a hint
The signup form sends three fields. The account record holds more than three. Add one the form never sends and see whether the server keeps it.
Second factor can be skippedCritical
Get into the staff account from the notes file, without ever entering its one-time code.
Stuck? Show a hint
Enter the password and stop at the code screen. Do not solve it โ go somewhere else on the site by typing the address in yourself, and see whether you are treated as signed in.
Broken authentication 0/5
The site works out who you are from things you are allowed to change.
Unsigned token accepted as genuineCritical
Sign in as an ordinary customer, then get the shop to treat you as staff by editing what your browser is holding. No password, and no key.
Stuck? Show a hint
One of your cookies is three blocks of text with dots between them. The first two are only encoded, not protected โ decode them and you will see who the site thinks you are, and what it claims is guarding the token. Change both blocks and hand it back.
Token signing key left in the config fileHigh
Make a properly signed token that the shop accepts as one of its own, for an account that is not yours.
Stuck? Show a hint
A signature is only worth something while the key behind it is secret. This deploy wrote its key down, in one of the files it left sitting in the web root.
Reset link built on an address the requester picksCritical
Make the password reset link for an account that is not yours arrive at a server you control, and take the account over with it.
Stuck? Show a hint
You can read your own mail in the mailbox, but not anybody else's โ so the code has to be made to arrive somewhere you can see. The forgotten-password form sends more than the box you can type in: one of its fields decides which site the link in that email points at, and nothing checks that site is this shop. You cannot run a server from in here, so the lab captures anything the shop addresses elsewhere โ the collector is linked at the bottom of this panel.
Reset code works on any accountHigh
Change somebody else's password using a reset code that was emailed to you.
Stuck? Show a hint
Ask for a code on your own address first and read it in your mailbox, so the code is honestly yours. Then look at the form you type it into: the code is not the only thing it asks for, and nothing checks that the two belong together.
Reset code can simply be guessedHigh
Get into an account by working through reset codes until one is taken. No mailbox to read, and no link to poison.
Stuck? Show a hint
Count the digits in a code you have been sent, and work out how many codes that is altogether. Then ask what stops you from sending all of them: a lockout, a delay, a puzzle, a cap on tries? Point a tool at the form, give it every code in that range, and watch for the answer that is not the same size as the rest. Pace it at about 50 a second โ the web server in front of the lab drops anything faster, and a dropped request could be the one that worked. That limit is out in the proxy, not in the shop.
Insecure direct object references 0/2
The server hands over whatever record number you ask for.
Another company's invoiceHigh
Read an invoice belonging to a different customer.
Stuck? Show a hint
Open one of your own invoices and look at the number in the address bar. Then change it.
Another customer's profileHigh
Read the personal details of a customer who is not you.
Stuck? Show a hint
Your own profile page has your account number in the address. The accounts either side of it belong to somebody.
Business logic flaws 0/2
Nothing is technically broken. The rules are just wrong.
Price decided by the buyerCritical
Buy the 1,000.00 laser printer for a fraction of its price.
Stuck? Show a hint
Look at every field the checkout form sends, including the ones you cannot see on the page. Ask which of them the server should have looked up for itself.
One-use coupon used many timesHigh
Get more than one discount out of a coupon that is limited to a single use.
Stuck? Show a hint
The server checks whether you have used it, then takes a moment, then applies it. Send several requests at the same instant so they all pass the check before any of them finishes.
SQL injection 0/2
What you type is read as part of a database query.
Catalogue search reads a table it should notCritical
Get the search box to hand back rows that are not products โ customer details the shop never shows to a visitor.
Stuck? Show a hint
Type a single quote into the search and read the error it gives back. It tells you the shape of the query. Once you can end the quote yourself, you can add a second query to the first โ the trick is that both halves must return the same number of columns, and the error keeps telling you when they do not.
Staff panel sign-in without a passwordCritical
Get into the staff panel without knowing any password at all.
Stuck? Show a hint
The panel builds its login the same careless way the search does. If the password can never be checked, what is left of the check? Ending the username early and commenting out the rest of the line is the classic shape.
Cross-site scripting 0/2
Text you supply is put into the page as part of the page.
Stored script in a product reviewHigh
Leave a review that runs your JavaScript for everyone who opens that product.
Stuck? Show a hint
Reviews come back onto the product page exactly as they were typed. Ask whether they come back as text, or as part of the page.
Script reflected from the search boxMedium
Get your JavaScript to run from a search results page โ a link you could send to someone.
Stuck? Show a hint
The shop repeats your search term back to you above the results. Watch how it is written into the page.
Everything you find is kept
Confirm a finding and it appears on your
Taghra progress page by itself โ nothing to copy, nothing to submit.
This shop forgets everything a few hours after you leave; your record over there does not.
Learn these bugs on Taghra โ every finding in here is taught in plain language on the Web Attacks path.
Mailbox โ this lab cannot send mail, so anything the shop emails a customer is delivered there. You can open your own messages.
Collector โ this lab cannot reach the internet, so anything the shop addresses to a server that is not its own is captured there instead.