HI Cyber Con CTF 2026. Web.
File Viewer
One symbolic link inside a zip turned an upload checker into a file reader. Flag in 2.8 minutes.
Published 2 November 2026. Challenge by 0x0Sayan.
The brief
Upload a file and explore the results.
In short
A small Python service unpacked uploaded zip files and served each entry back. It never rejected symbolic links, so an entry pointing at /app/flag.txt made it read the flag, and any other file, from disk.
A blind zip checker
The target is a small Python app called Zip Checker. Upload a zip and it unpacks it, lists every entry and gives each one a download link. There is no source to read, only what it sends back.
Every upload gets its own folder
A test zip with one small file came back as a link under a random 32 character folder, serving exactly the bytes it held. Any ../ in that link, plain or encoded, got a 404. The route kept requests inside the folder.
A zip entry can be a symbolic link
Zip entries carry Unix file modes, and mode 120777 means a symbolic link. The lab packed four links into one zip, aimed at likely flag paths and at /etc/passwd. One, appflag.txt, pointed at /app/flag.txt.
The server follows the link
The checker unpacked the links as links and never asked where they point. A request for appflag.txt passed the path check, because the name sits inside the folder. Opening it then followed the link out to /app/flag.txt.
The flag, and any file the app can read
The response was 30 bytes, the flag. The link to /etc/passwd returned the system's user list as well, so this was a full arbitrary file read. The solve took 2.8 minutes.
The insight
A safe looking path is not a safe file. The checker vetted the name in the link, then served whatever the zip said each entry was, links included.
The flag
hiCTF{E45Y_5yml1Nk_be91fa8d6b}