Syed Ahmer ShahSyed Ahmer ShahSyed Ahmer ShahSyed Ahmer ShahSyed Ahmer Shah — home
  1. …
  2. Engineering Logs
  3. The Engineering Logs
  4. I Invented 14 People to Break My University Website
Part 20 of 21

I Invented 14 People to Break My University Website

A careless applicant, an impatient one, a sneaky one and an actual attacker walk into an admissions office. Here's what they broke.

Written by

Syed Ahmer Shah

Software Engineer

Oct 30, 20267 min read1,524 words—reading now▼
The AIT registration page with its quick security check, under the title I invented 14 people to break my university website
Read this articlevoice
Markdown

For about two months I was sure my website worked. I had clicked through it a hundred times. I'd register as an applicant, fill in the form, upload a photo, sign in as the admin, approve myself, and sign back in as a brand new student. Everything went green. Every time.

The website is AIT, short for Ahmer Institute of Technology: a made-up university with a real admissions system behind it. Students apply online and upload documents. Admins review and approve them. Teachers take attendance and enter marks. I built it after an internship where I worked on a portal like this one, and I wrote up the technical side in the AIT case study.

The problem with my hundred clicks was that I was always the same person. I knew where every button was. I never typed my password wrong. I never pressed submit twice. Real people do all of that, and some of them do worse on purpose.

So I invented fourteen of them.

#Meet the cast

Each one is a short script that drives a real web browser, clicking and typing the way a person would. They go through one full admissions season together, in order, and if any of them hits something unexpected, the test fails and tells me where.

Ayesha is a visitor. She reads all fourteen public pages, opens the menu on her phone, and checks that every page has a sensible title and nothing broken.

Bilal is a parent with a question. He uses the contact form like a normal person, and then the test tries it the way a spam bot would: too fast, and with a hidden field filled in that no human can see. The bot version gets refused.

Hamza is the applicant everyone has met. He gets every field on the registration form wrong at least once. Then he forgets his password and keeps guessing.

Sara is the good student. She applies, gets admitted, chooses her own password and sees her classes, marks and announcements. If Sara can't get through, nobody can.

Rabia is impatient. Her internet is slow, so she presses "Submit" three times at once.

Zainab is sneaky. She uploads a program pretending to be a photo, and a PDF with hidden code inside it.

Usman gets rejected and needs to see why.

Then there's the staff. Imran is the head admin. Nadia and Omar are assistant admins who are each allowed to do only one job. Kamran is a new teacher. Farah is a Head of Department. Ali works in security and shouldn't see department records at all.

And then there's Eve. Eve is an attacker. She tries to read other people's files, trick the site into running her code, guess passwords and get into pages she has no business seeing.

The AIT registration form with name, CNIC, date of birth and password fields and a quick security check asking what 3 plus 9 is
The AIT registration form with name, CNIC, date of birth and password fields and a quick security check asking what 3 plus 9 is

#Hamza found the first bug in about a minute

Hamza's job was simple: get his password wrong five times and get locked out for a while. That's a basic protection. Without it, a bot can try thousands of passwords until one works.

He didn't get locked out. He could keep guessing forever.

The lockout code looked fine. It saved the time when the lock should end, and checked it on every sign-in. The trouble was the clock. The database thought it was one time, and the website code thought it was another, five hours apart. So every lock was saved as already expired. On my laptop, where both happened to agree, it worked. In the Docker setup, which is closer to a real server, it never did.

I would never have found that by clicking around, because I never typed my own password wrong five times.

While fixing the sign-in page I found a second one hiding behind it. Admitted students who typed the correct password were having it counted as a failed attempt. A careful student could lock themselves out just by signing in a few times.

#Sara couldn't even get to her dashboard

This one was embarrassing. After an applicant signed in, the site sent them to a page address that didn't exist. Every single applicant landed on a "page not found" screen.

How did I miss that? Because when I tested, I was already signed in from earlier and went straight to the right page. Sara started from nothing, the way a real person would.

When Sara was finally admitted, she had no classes. Approval gave her a student ID, but never actually enrolled her in her first-semester subjects. Her timetable was empty, and Kamran's class list was empty too. Some approved students were even put in departments that didn't exist.

#Rabia pressed submit three times

If you've ever pressed a button twice because a page was slow, you've done what Rabia does. Her test sends three copies of the same application at the exact same moment.

The right answer is one application. The website now locks the record while it works on it, so the second and third copies wait, see the first one already finished, and stop. And the database itself refuses a second application for the same person in the same admission cycle, as a backstop. Rabia's test checks that exactly one application exists at the end. Not zero, not two.

Also readZovita+: Building an Online Pharmacy That Adapts to Each Shopper
BookMyMovie: Building a Cinema Ticketing Platform

#Zainab's fake photo

Zainab's "photo" is really a small program with a .jpg name. If a website saves that file somewhere public and someone then visits it, the server might run it. That's how a lot of sites get taken over.

AIT checks the first few bytes of every file, which give away what it really is no matter what it's called. Zainab's fake photo fails that check. Her PDF with hidden code inside gets rejected too. Even real photos are rebuilt from scratch before they're saved, so nothing can hide inside them, and they're stored where the public can't reach them.

The admin applications queue: applicants with their CNIC, program choice, challan status and Approved, Applied or Rejected badges
The admin applications queue: applicants with their CNIC, program choice, challan status and Approved, Applied or Rejected badges

#Kamran could mark anyone

Kamran is a teacher. He should only take attendance for students in the subjects he teaches. The test tried to make him mark a student from someone else's class.

It worked. The site checked that Kamran was a teacher, but not that the student was his. Any teacher could have changed anyone's attendance or marks. That's now fixed, and the test makes sure it stays fixed.

Nadia and Omar found the same kind of problem on the admin side. Some admin actions didn't check whether the assistant admin had permission for that job, and an assistant whose access had expired could still use a few pages.

The teacher attendance page: a subject, a class date and a list of students with Present, Absent, Late and Excused options
The teacher attendance page: a subject, a class date and a list of students with Present, Absent, Late and Excused options

#Eve tried everything

Eve's list is long. She changes numbers in web addresses to try to open other students' documents. She tries to download files by walking up folders. She submits forms from a fake website. She types code into name fields, hoping it runs when an admin views them. She guesses passwords. She asks for files that should never be public, like the site's settings.

Most of her attacks bounced off. Working through her list did turn up one real problem, though: a teacher's name was being dropped straight into a page in the admin panel. A teacher named with a bit of code could have run that code in the head admin's browser. It's an easy mistake to make and a bad one to leave in.

#The ones that made me laugh

Some bugs were just odd. The "what is 3 + 9" check on forms kept showing an old question after a mistake, so someone who fixed their form could never get past it. The pop-up windows on two admin tables were placed in a spot browsers don't allow, so the tables quietly fell apart. And about one in every 500 temporary passwords that the site made up for new students broke the site's own password rules, because it sometimes forgot to include a lowercase letter.

One in 500. I'd have needed to approve a few hundred students by hand to see it once.

#What I took away

Fifty-eight tests and fourteen people found more than a dozen real bugs in a website I was confident about. Not one of them showed up in my own clicking, because I always behaved like someone who built the site.

That's the part I keep coming back to. The bugs weren't in clever code. They were in the ordinary moments: a wrong password, a slow connection, a teacher clicking the wrong student, a clock set to a different time zone. You find those by pretending to be someone else, as many times as you can, and letting a computer do the pretending so you can do it again tomorrow.

All fourteen of them still run every time the code changes. The project and its tests are on GitHub.

Find me across the web.

Same person, every platform

Work & code

  • ASPortfolioahmershah.dev
  • LinkedInin/syedahmershah
  • GitHub@ahmershahdev
  • AWSAWS Builder Center@syedahmershah
  • Crunchbasesyed-ahmer-shah
  • LinkedIn · Companycompany/syedahmershah

Writing

  • Dev.tosyedahmershah
  • Medium@syedahmershah
  • Hashnode@syedahmershah
  • Substack@syedahmershah
  • HackerNoonu/syedahmershah
  • CLCoderLegionuser/syedahmershah

Reviews & listings

  • Google Knowledge PanelSyed Ahmer Shah
  • Google Business Profileg.page
  • ClClutch
  • TpTrustpilot
  • DRDesignRush
  • TBTechBehemoths

Social

  • YouTube@ahmershahdev
  • Instagram@ahmershahdev
  • TikTok@ahmershahdev
  • Facebookahmershahdev
  • X@ahmershahdev
#ait#testing#playwright#websecurity#qa#engineeringlogs
ShareXLinkedInRedditWhatsApp

← Previous in series

AIT: Building a University Admissions Portal From Scratch

On this page

  • Meet the cast
  • Hamza found the first bug in about a minute
  • Sara couldn't even get to her dashboard
  • Rabia pressed submit three times
  • Zainab's fake photo
  • Kamran could mark anyone
  • Eve tried everything
  • The ones that made me laugh
  • What I took away

The Engineering Logs

  1. 01The Edge Latency Lie: Solving Global Consistency
  2. 02Top 10 AI Tools Every Frontend Developer Should Know (2026 Guide)
  3. 03Change One Number. Take Everything.
  4. 04How Databases Work: From Tables to Query Execution
  5. 05The New Era of Software Engineering
  6. 06The Art of Object-Oriented Programming
  7. 07GleanGrid: Building a Pre-Order Marketplace for Farmers Markets
  8. 08The Last Mango Problem: Race Conditions in a Real Marketplace
  9. 09BookMyMovie: Building a Cinema Ticketing Platform
  10. 10One Seat, Two Buyers: Race Conditions, IDOR and Keys in a Cinema Booking System
  11. 11Zovita+: Building an Online Pharmacy That Adapts to Each Shopper
  12. 12The Discount That Knew You Were Hesitating: Rule-Based Personalisation in an Online Pharmacy
  13. 13RAG Retrieval Strategies on a 50k-Document Dataset: BM25 vs Dense vs Hybrid
  14. 14Inside the Database Stack
  15. 15HolidayOps: Building a Working Days API for 250 Countries
  16. 16The Weekend Is Not a Constant
  17. 17MarketClock: A Trading Calendar That Shows Its Work
  18. 17Cybersecurity Trends: Protecting Data in the Digital Age
  19. 18The Day the Money Moves
  20. 19AIT: Building a University Admissions Portal From Scratch
  21. 20I Invented 14 People to Break My University Website

Up next

Keep reading.

All 59 articles→
  1. 01

    AIT: Building a University Admissions Portal From Scratch

    How I turned what I learned in my XCL Technologies internship into Ahmer Institute of Technology: a university website with applicant, student, teacher, staff and admin portals, safe file uploads, Docker, and 58 end-to-end tests that found real bugs.

    Oct 30, 20268 minThe Engineering Logs

  2. 02

    One Seat, Two Buyers: Race Conditions, IDOR and Keys in a Cinema Booking System

    How BookMyMovie makes sure one cinema seat is never sold twice, a guessed booking number shows nothing, and a leaked or missing key can't quietly break tickets: row locks, lock order, a NULL-tolerant unique key, status compare-and-set, idempotency, IDOR scoping, HMAC tickets, captcha step-up, and the bugs that still got through.

    Sep 29, 202611 minThe Engineering Logs

  3. 03

    The Day the Money Moves

    When you buy a share, you don't own it the moment you click. A plain-language story of trade settlement, T+1 and T+2, why holidays in two countries can push a payment back a day, and what building MarketClock taught me about dates that have a history.

    Oct 24, 20264 minThe Engineering Logs

  4. 04

    The Weekend Is Not a Constant

    Why 'is this a working day?' breaks so much software: weekends that differ by country and change over time, holidays that follow the moon, time zones that disagree about today, and the habits that kept my own date logic honest while building HolidayOps.

    Oct 18, 20265 minThe Engineering Logs

  5. 05

    RAG Retrieval Strategies on a 50k-Document Dataset: BM25 vs Dense vs Hybrid

    How BM25, dense embeddings and hybrid search (RRF) behave on a 50k-document RAG corpus: working code, honest trade-offs, and when each one actually wins.

    Oct 5, 202611 minThe Engineering Logs

  6. 06

    The Discount That Knew You Were Hesitating: Rule-Based Personalisation in an Online Pharmacy

    How Zovita+ turns browsing into personal discounts without a machine-learning model: one visitor key for guests and customers, interaction counters, six offer rules, one pricing function for the bag and the charge, offers locked and redeemed once at checkout, guest-to-account merging, A/B tests, and the edge cases that shaped it.

    Oct 2, 202610 minThe Engineering Logs

Available for new work · --:--:-- PKT

Have an idea?

sales@ahmershah.dev
Book a call WhatsApp +92 370 4831994

On this site

  • 01About
  • 02Education
  • 03Certificates
  • 04Skills
  • 05Projects
  • 06Experience
  • 07Services
  • 08Testimonials
  • 09Contact

Pages

  • Projects
  • Blog
  • Saved articles
  • RSS
  • Privacy Policy
  • Terms of Service
  • llms.txt

Elsewhere · official profiles

26 links

Professional

Work history, code and credentials.

  • in/syedahmershah
  • company/syedahmershah
  • @ahmershahdev
  • syed-ahmer-shah
  • syed-ahmer-shah
  • u/syedahmershah
  • @syedahmershah
  • AWS@syedahmershah

Coding & credentials

Problem solving, verified badges.

  • u/syedahmershah
  • syedahmershah
  • users/syedahmershah
  • learner/syedahmershah

Google & business

The official listings.

  • Google Business Profileg.page
  • Syed Ahmer Shah
  • syedahmershah
  • Beaconssyedahmershah
  • syedahmershah

Social (@ahmershahdev)

Build logs, clips, threads.

  • @ahmershahdev
  • @ahmershahdev
  • @ahmershahdev
  • ahmershahdev
  • @ahmershahdev
  • @bluesky.ahmershah.dev
  • ahmershahdev

Design

Interfaces and visuals.

  • syedahmershah
  • syedahmershah

Direct

  • sales@ahmershah.dev

    New projects & quotes

  • support@ahmershah.dev

    Support & help

  • syedahmershahofficial@gmail.com

    Personal

  • +92 370 4831994

    Phone · WhatsApp

  • Hyderabad, Sindh, Pakistan

    Remote-first · Asia/Karachi (UTC+5)

Resume ↗
SYED AHMER SHAH

© 2026 Syed Ahmer Shah. All rights reserved.

PrivacyTermsRSS
ahmershah.dev