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
web

Step 4 · Confirm that JSON field values are parsed as XML

Objective: Inject XML-special characters into a JSON field value and observe the server's response to confirm that the data passes through an XML parser.

Context: A value that returns [object Object] instead of the literal string you sent is a strong signal that the server is treating your input as XML markup rather than plain text. This is not SSTI — it is evidence of a JSON-to-XML round-trip.

Progressive hints

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

Hint 1 — directional nudge

What happens when you put XML markup characters (like angle brackets) inside a JSON string value? Watch what comes back when you read the created deck.

Hint 2 — technique / vuln class

Set the description field to a value containing XML tags, e.g. "<test>". Retrieve the created deck and compare what the stored description says versus what you sent.

Hint 3 — near solution

POST restore with {"name":"probe","description":"<test>","category":"c","cards":[]}. Then GET /api/decks/<new-id>. If description comes back as [object Object], the server parsed <test> as an XML child node — your JSON values are being interpolated raw into XML and re-parsed.

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 ☕ ☕