Skip to content
Bugwise
Menu
Web Testing

Security Basics for Testers

The simple, authorized security checks every manual tester can do on a web app, from access control and login to input handling, data exposure and responsible reporting.

35 min intermediate Web

A tester at a sports shop is checking the new “Order details” page. The address bar says shop.example.com/orders/1042. Out of curiosity, she changes it to /orders/1043 and presses Enter. The page loads, showing a different customer’s name, home address and the running shoes he bought last week.

Nobody hacked anything. She changed one number. That is one of the most common and most serious security bugs on the web, and a careful manual tester can find it in ten seconds.

This lesson shows you the basic security checks you can and should do as a manual tester, and how to do them safely and ethically.

Why it matters

Security bugs are different from most bugs. A broken button annoys users. A security bug can leak thousands of people’s addresses, card details or health data, lead to fines under privacy laws like GDPR, and destroy trust in a brand overnight.

And many of the worst leaks were not clever hacks. They were things like:

  • an order page that showed any order if you changed the number,
  • an admin page that was hidden from the menu but not actually protected,
  • an API that sent the whole customer record to the browser, and the app just didn’t display most of it.

You don’t need to be a hacker to find those. You need to be curious, methodical and to know where to look. That’s security testingSecurity testingChecking that data and features are protected from unauthorized access and attacks.Open in glossary → at a tester’s level.

What you do vs what specialists do

A manual tester (you)A security specialist / penetration tester
Checks access rules with two test accountsAttempts to chain several weaknesses into a real attack
Tries special characters and harmless markup in fieldsUses dedicated tools and real attack payloads, under a signed agreement
Looks at URLs, DevTools and API responses for leaked dataReviews code, infrastructure and encryption settings
Verifies login rules, logout and session expiryTests the whole system against attack scenarios
Reports findings privately with clear stepsWrites a formal security assessment

The OWASP Top 10, as a map

OWASP (the Open Worldwide Application Security Project) is a non-profit that publishes the OWASP Top 10: a list of the most critical web application security risks, updated every few years (2017, 2021, 2025). Developers and security teams all over the world use it as a shared vocabulary.

You don’t need to memorize it. Use it as a map that tells you which areas deserve attention. Here are the categories where manual testers can contribute most (names from the 2025 list):

Risk area (OWASP name)What it means in plain EnglishWhat a tester can check
Broken access controlUsers can see or do things they shouldn’t. It is #1 in both the 2021 and 2025 lists.Change IDs in URLs, open admin pages as a normal user
Authentication failuresWeak login, password and session handlingLockout, error messages, logout, session expiry
InjectionText you type is treated as code or a database commandSpecial characters, harmless HTML, visible SQL errors
Cryptographic failuresSensitive data not protected properlyHTTPS everywhere, no passwords in URLs or storage
Security misconfigurationUnsafe default settings, debug info switched onStack traces on error pages, directory listings
Mishandling of exceptional conditionsThe app fails in an unsafe way when something unexpected happensError pages that leak details, crashes on odd input

Authentication checks

AuthenticationAuthenticationChecking who a user is, usually with a password, a code or biometrics.Open in glossary → answers the question “who are you?”. Login is where most of these checks live, and the Login and Sign Up lesson covers it in depth. The security-focused checks are:

CheckHow to test itWhat good looks like
Lockout / throttlingEnter a wrong password 5–10 times in a row on your test accountThe account or device is temporarily blocked, or a CAPTCHA appears. This stops a brute-force attackBrute-force attackGuessing passwords or codes over and over until one works.Open in glossary →.
Generic error messagesTry a registered email with a wrong password, then an unregistered emailBoth show the same message, e.g. “Email or password is incorrect”. Different messages allow account enumerationAccount enumerationFinding out which emails are registered from differences in error messages or responses.Open in glossary →.
Password rulesTry passwords that are too short, common (“password123”) or match the emailWeak passwords are rejected by the server, not only by the form
LogoutLog out, then press the browser’s Back button and reloadYou see the login page, not the account. Old pages don’t come back from cache.
Session expiryStay idle longer than the agreed timeout (ask the team), then click somethingYou’re asked to log in again. The old session tokenSession tokenA string the server issues after login that proves who you are on later requests.Open in glossary → no longer works.
Password resetRequest a reset link, use it, then try the same link againLinks expire and work only once. The message doesn’t reveal whether the email exists.

Authorization: broken access control

AuthorizationAuthorizationChecking what a logged-in user is allowed to see or do.Open in glossary → answers “what are you allowed to do?”. Bugs here are called broken access control, and they are the most common serious security bug on the web.

The key idea: the server must check permissions on every request. Hiding a button or a menu item is only cosmetic. If the server doesn’t check, anyone who types the right URL or sends the right request gets in.

Three checks you can do with two test accounts

  1. Change IDs in URLs (IDOR). Log in as test user A and open one of A’s items, e.g. /orders/1041. Note an ID that belongs to test user B (log in as B in another browser to find it). As A, change the URL to B’s ID. You should get 403 Forbidden or 404 Not Found, never B’s data. This bug is called an IDOR (Insecure Direct Object Reference).
  2. Open admin pages as a normal user. Ask the team for the admin URLs (or note them while testing as an admin). Then log in as a normal customer and paste the URL. You should get 403 or be redirected, even though the “Admin” link is hidden.
  3. Hidden buttons vs server checks. If a feature is only for some users (e.g. “Issue refund”), the API behind it must check the role too. Testers check this by repeating the request as a normal user with a proxy toolProxy toolA program that sits between the app and the server so you can watch and change network traffic.Open in glossary → or an API tool, or by asking a developer to confirm the server-side check.

Try it: the access-control lab

Below is a simulated test environment with two test users, Anna and Ben. Switch between the secure and the vulnerable version of the same shop and try all three checks. Notice how the vulnerable app looks exactly the same until you test it.

App version

Logged in as (test user)

Try:3 · Add isAdmin to a request
shop.test
FitShop Anna

Hi, Anna

anna@test.com

Your orders

Logged in as Anna Novak (customer)

Your orders are 1041 and 1042. Now try an order number that is not yours, or open /admin.

Edit a request (like a proxy tool would)

PATCH /api/profile

{
  "name": "Anna Novak"
}

Response

Not sent yet.

Simulated test environment with fake test users. No real requests are sent.

Input handling

Every text field, search box, URL parameter and form is a door into the app. Good apps treat whatever comes through that door as plain data. Weak apps accidentally treat it as code, which leads to SQL injectionSQL injectionAn attack where text typed into a field is run as a database command.Open in glossary → and Cross-site scripting (XSS)Cross-site scripting (XSS)An attack where text a user enters is run as code in other people's browsers.Open in glossary →.

You don’t need attack payloads to spot the warning signs. Simple, harmless input is enough:

Try typingWhyWarning sign
O'Brien (apostrophe)Apostrophes and quotes ' " have special meaning in databases and codeAn error page, a “SQL syntax” message, or the search silently breaks
<b>test</b> or <i>hi</i>Harmless HTML formatting tagsThe text appears bold or italic instead of showing the tags. User input is being rendered as HTML, which is an XSS risk.
< > & "Characters that HTML usesThe page layout breaks, text disappears or a field cuts off
Zoë, Łódź, emojiNon-English charactersGarbled text like Zoë (an encoding bug, not security, but worth reporting)
A very long text (5,000+ characters)LimitsServer error, page freezes, or the text overflows the layout

Harmless markers

Type <b>test</b> in a review, then look at the published review. If you see the word test in bold, report “user input is rendered as HTML”. The developers will understand the risk.

Real attack payloads

Don’t copy script snippets or “SQL injection cheat sheets” from the internet into the app. You might damage test data, trigger security alarms or affect other people. Proving the risk is enough; exploiting it is a specialist’s job.

Sensitive data exposure

Sensitive data (passwords, tokens, card numbers, addresses, health data) should only travel where it’s needed and never be left lying around. Here’s where testers find it:

HTTPS and mixed content

HTTPSHTTPSThe secure version of HTTP; traffic between the browser or app and the server is encrypted.Open in glossary → encrypts traffic between the browser and the server. On a modern site, every page should use it, not only login and checkout.

File uploads

Profile photos, receipts, CVs: upload features are a favorite target. Basic checks:

Rate limiting

rate limitingRate limitingCapping how many requests a user or device can make in a period of time.Open in glossary → caps how often something can be done. Without it, attackers can guess passwords, coupon codes or one-time codes by trying thousands of times.

Check the features where repetition is dangerous: login, “Send code again” for SMS or email, password reset, coupon or gift-card fields, sign-up. Repeat the action 10–20 times quickly. Good apps slow you down, show “Too many attempts, try again in 5 minutes” or return the HTTP status 429 Too Many Requests.

What to test

Access control: change IDs in URLs and API calls between two test users · open admin and other users’ pages as a customer · try actions on items that are not yours (edit, cancel, delete) · check that hidden or disabled buttons are also blocked by the server.

Authentication and sessions: lockout after repeated failures · identical error messages for wrong email and wrong password · logout invalidates the session (Back button, second tab) · session expires after the agreed idle time · password reset links expire and are single use.

Input: apostrophes and quotes in every field · harmless markup like <b>test</b> in anything that is shown to other users (reviews, names, comments, chat) · very long input · special characters in URL parameters.

Data exposure: URL after login and form submissions · Local Storage, Session Storage and cookies · API responses in the Network tab · error pages and 404 pages · emails and notifications.

Transport, uploads and limits: HTTPS redirect and mixed content · file type, size and name checks · rate limits on login, codes and coupons.

Common security bugs

#BugWhat you seeTypical severity
1IDORChanging /orders/1041 to /orders/1043 shows another customer’s orderCritical
2Unprotected admin pageA normal user can open /admin by typing the URLCritical
3Privilege escalationAdding "isAdmin": true or "role": "admin" to a request upgrades the accountCritical
4HTML injection / XSS risk<b>test</b> in a review appears as bold text for everyoneHigh
5SQL error on special charactersAn apostrophe shows a database error or a stack traceHigh
6Password in URL?password=... appears in the address bar after loginHigh
7API over-sharingThe response contains other users’ emails, phone numbers or internal fieldsHigh
8Account enumeration“No account with this email” vs “Wrong password”Medium
9No lockout or rate limitUnlimited password or code attemptsMedium–High
10Session not invalidatedAfter logout, Back or a second tab still shows the accountMedium–High
11Mixed content / no HTTPS redirecthttp:// stays on HTTP, Console shows Mixed Content warningsMedium
12Upload accepts anythingA .exe renamed to .jpg or a 500 MB file is acceptedMedium

Find the bug

This is a vulnerable test build of a small sports shop. It runs entirely in your browser with fake test data, so explore freely. Log in with the test account shown on the page, then:

  • Watch the address bar and the DevTools · Network panel (click a request to see its response).
  • Open your orders, then try other order numbers.
  • Search for something with an apostrophe, like runner's.
  • Write a review with harmless markup.
  • Try URLs that a customer shouldn’t reach.

🐞 Bug hunt: FitShop test build

This demo has 6 hidden bugs. Explore it like a tester, then check your findings.

Found0/6
fitshop.test
FitShop

Log in

Test account: anna@test.com / Fit-test-42

DevTools · Network

  • Requests appear here. Click one to see its response.
  1. 1

    Hint: Open one of your orders, then edit the number in the address bar.

  2. 2

    Hint: Is there a page the menu does not link to?

  3. 3

    Hint: Post a review containing a harmless formatting tag.

  4. 4

    Hint: Search for runner's.

  5. 5

    Hint: Open a product page and inspect the reviews request in the Network panel.

  6. 6

    Hint: Look at the address bar right after you log in.

Reporting security bugs responsibly

A security bug report is different from a normal bug reportBug reportA clear written description of a bug so developers can reproduce and fix it.Open in glossary →. The goal is to get it fixed without spreading the details.

  1. Stop and write down what you did. Exact steps, test accounts used, time, environment and build number. Don’t keep exploring “to see how far it goes”.
  2. Report privately. Use your team’s security process: a restricted ticket type, a private security project, or a direct message to the security contact or tech lead. Never post it in a public tracker, a big team channel or a public GitHub issue.
  3. Set the severity honestly. Ask: what data or action is exposed, to whom, and how easy is it? Anything that exposes other users’ personal data or gives admin rights is usually critical or high severitySeverityHow much damage a bug does to the product or the user.Open in glossary →.
  4. Show impact, don’t over-prove it. One screenshot of another test user’s order is enough. Don’t collect or download data.
  5. Mask sensitive values in screenshots and logs (tokens, passwords, real personal data if any slipped into test data).
  6. Retest the fix and also try the same trick on similar pages (other IDs, other object types like invoices or addresses).

Tools & how-to

Open DevToolsDevToolsDeveloper tools built into browsers for inspecting pages, network traffic and errors.Open in glossary → with F12 or Cmd+Option+I (Mac) in Chrome, Edge or Firefox.

  • Network tab: click a request, then Headers (method, URL, status, cookies sent) and Response / Preview (the data the server returned). Tick Preserve log so requests survive page changes.
  • Application tab (Firefox: Storage): Local Storage, Session Storage and Cookies. Check the cookie flags Secure, HttpOnly and SameSite.
  • Console tab: Mixed Content warnings, JavaScript errors and sometimes leaked debug logs.
  • Security / padlock: click the icon left of the URL to see certificate details.
  • Proxy tools like Burp Suite Community Edition, ZAP, Charles or Proxyman sit between the browser (or phone) and the server. You can see every request, and edit and resend it, for example to change an order ID or add a field. Use them only on your own test environment.
  • API tools like Postman or Insomnia let you replay an API call with another user’s token to check access rules. See API Testing with Postman.
  • Automated scanners (such as ZAP’s scan modes) are usually run by security or DevOps teams. Don’t run them on shared environments without permission.

Example test cases

TC-SEC-001A customer cannot open another customer's order by changing the ID

Preconditions

  • Test users A and B exist in staging
  • User B has order #1043

Steps

  1. Log in as user A
  2. Open one of your own orders
  3. Change the order ID in the URL to 1043
  4. Press Enter

Expected result

403 or 404 is shown. None of user B's data appears on the page or in the API response.

TC-SEC-002Admin page is blocked for a normal customer

Preconditions

  • Logged in as a customer test account

Steps

  1. Type /admin in the address bar
  2. Press Enter
  3. Check the Network tab

Expected result

Access denied (403) or redirect to the home page. The admin API returns 403 and no admin data.

TC-SEC-003User input is shown as text, not rendered as HTML

Steps

  1. Open a product page
  2. Post the review: <b>test</b> <i>review</i>
  3. Reload the page

Test data

Review text: <b>test</b> <i>review</i>

Expected result

The review shows the tags literally as typed. Nothing is bold or italic.

TC-SEC-004Special characters in search do not cause a server error

Steps

  1. Search for runner's
  2. Search for "quoted"
  3. Search for < > &

Expected result

Normal results or "No products found". No error page, SQL message or stack trace.

TC-SEC-005Credentials never appear in the URL

Steps

  1. Open DevTools › Network with Preserve log on
  2. Log in with the test account
  3. Check the address bar and the login request

Expected result

The login request is a POST. Email and password are only in the request body, never in the URL or query string.

TC-SEC-006Logout ends the session

Steps

  1. Log in and open My account
  2. Open My account in a second tab
  3. Log out in the first tab
  4. Press Back, then reload the second tab

Expected result

Both show the login page. Requests with the old session return 401.

TC-SEC-007Account is temporarily locked after repeated failed logins

Preconditions

  • Agreed with the team: lockout after 5 failures for 15 minutes

Steps

  1. Enter a wrong password 5 times for the test account
  2. Enter the correct password

Expected result

After the 5th failure a lockout message appears and the correct password is refused until the lockout ends.

Tip: click a test case to expand it.

Checklist

Basic security checklist (test environment only)

0 of 15 checked

Check your understanding

Quick quiz

0/5 answered · 0 correct

  1. 1.You find a security bug on a big online shop you use privately, not at work. What should you do?

  2. 2.As test user A you change /orders/1041 to /orders/1043 and see test user B's order. What is this?

  3. 3.The Admin link is hidden from customers' menus. Is the admin area secure?

  4. 4.Which input is the safest, most appropriate way for a manual tester to check for HTML injection?

  5. 5.Where should you look to see if an API sends more personal data than the page shows?

Key takeaways

  • Only test what you’re authorized to test: your team’s test environment, with test accounts. Deep penetration testing is a specialist job.
  • Broken access control is the top risk: change IDs, open admin URLs as a normal user, and remember that hidden buttons are not security.
  • Use harmless input (', ", <b>test</b>) to spot injection risks; error pages with SQL or stack traces are bugs too.
  • Look for leaked data in URLs, browser storage, API responses and error pages.
  • Check HTTPS, uploads and rate limits, and report security bugs privately with clear steps and honest severity.

Finished this page?Nice work, this page is complete!

Mark it as done to track your progress. It's saved in this browser, no account needed.

Its review cards are now in Bites ⚡
Esc

Type to search the whole site.