Hintru Tip ENES ← All labs

Tanuki: Flashcard Backup Restore

EN medium CTF challenge XXEXML External Entityin-band exfiltrationJS bundle reconAPI enumerationDTD injectionarbitrary file read
Original

Tanuki is a flashcard web app with an XML-based deck export and a JSON-driven restore endpoint. The server secretly round-trips your JSON through an XML template with DTD processing enabled — giving you a path to read arbitrary files off the server without any out-of-band channel. Your goal is to exfiltrate the flag at /app/flag.txt entirely in-band.

0/7
solved
Step 1 Step 2 Step 3 Step 4 Step 5 Step 6 Step 7
enumeration

Step 3 · Probe the restore endpoint's accepted format

Objective: Determine what Content-Type and body structure the restore endpoint actually requires — it will silently succeed regardless of input, so you need a way to verify that data was truly processed.

Context: POST /api/decks/:id/restore always responds 'Backup restored successfully' and creates a new deck. Sending raw XML (application/xml, text/xml, multipart) appears to work but produces only an empty 'Untitled Deck'. The real contract is different. The :id in the URL is cosmetic — any value works.

Progressive hints

Only reveal the ones you need. Claude tracks how many you used to calibrate the feedback.

Hint 1 — directional nudge

The endpoint claims success no matter what you send. How can you tell the difference between 'accepted and processed' vs 'silently ignored'? Try changing the Content-Type and body format.

Hint 2 — technique / vuln class

Try sending a JSON body instead of XML. Use Content-Type: application/json with keys that mirror the deck schema (name, description, category, cards). Check whether a real deck with your data appears afterward.

Hint 3 — near solution

POST to /api/decks/1/restore with Content-Type: application/json and body {"name":"Demo","description":"d","category":"c","cards":[{"front":"Q1","back":"A1"}]}. Then GET /api/decks to confirm a new deck was created with those exact values.

Ask the tutor

Chat with a spoiler-safe tutor for this step. It uses only this lab spec and gives the smallest useful nudge first.

Tell the tutor what you tried, where you got stuck, or paste the response/error you are seeing.

Your attempt

Spotted something to improve?

Polish the wording, sharpen a hint, add missing context, fix a payload — your version stays separate from the original and other learners can choose it.

⚠ Report this lab

Enjoying Hintru? Buy me a coffee ☕ ☕