Web Security Academy
Hello there, ('ω')ノ 1. 概要:ガジェットとは何か(復習) プロトタイプ汚染そのものは「Object.prototype にプロパティを追加できる状態」。 でも実害にするには ガジェット(gadget) が必要:アプリがそのプロパティを検証無しで読み取り、危険な使い方…
Hello there, ('ω')ノ 概要(短く) 攻撃のアイデア:Object.prototype に任意プロパティを追加できれば、ページ内の多くのオブジェクトがその値を継承する。 クライアント側での典型的な入力経路:クエリ文字列、ハッシュ(フラグメント)、JSON入力(postM…
Hello there, ('ω')ノ ガジェットとは何か? 簡単に言うと、アプリやライブラリが信頼して使っているプロパティで、以下の2つを満たすものが「ガジェット」と呼ばれます: 条件 説明 ✅ アプリがそのプロパティを使っている しかもフィルターや検証なしに使…
Hello there, ('ω')ノ 攻撃に使われる悪意あるJSON 攻撃者が以下のようなJSONを送信したとします: { "__proto__": { "evilProperty": "payload" } } 例えば、WebSocketのメッセージやAJAXリクエストなどでサーバやフロントエンドに送信されることがありま…
Hello there, ('ω')ノ 攻撃の出発点:悪意あるURL https://vulnerable-website.com/?__proto__[evilProperty]=payload このURLのクエリパラメータ部分に注目してください: ?__proto__[evilProperty]=payload これは、JavaScriptでオブジェクトを作成する時…
Hello there, ('ω')ノ 問題のコード:1行ずつ分解 まず、改めて「マージ関数」と「渡すデータ」を確認します: マージ関数 function merge(target, source) { for (let key in source) { if (typeof source[key] === 'object') { if (!target[key]) target…
Hello there, ('ω')ノ 危険な関数 まず、以下の関数は「2つのオブジェクトをマージ(結合)する処理」です: function merge(target, source) { for (let key in source) { if (typeof source[key] === 'object') { if (!target[key]) target[key] = {}; me…
Hello there, ('ω')ノ プロトタイプ汚染とは? Prototype Pollution(プロトタイプ汚染) は、JavaScriptの「プロトタイプ継承」の仕組みを悪用して、攻撃者がグローバルオブジェクトに不正なプロパティを追加し、それを他のオブジェクトに「引き継がせる」…
Hello there, ('ω')ノ 要約(結論) このラボは フロントエンドが Transfer-Encoding(chunked)を使い、バックエンドが Content-Length を使う(TE.CL)不一致 を突く典型例です。Burp Repeater で HTTP/1.1 にし、「Update Content-Length」をオフにした状…
Hello there, ('ω')ノ 概要 HTTP/1.1 の chunked 転送 を使った挙動で、末尾の 0(ゼロチャンク)の後に正しい改行(CRLF)があるかどうかで挙動が大きく変わります。実際に「最後の 0 のあとに改行がないと smuggling が成立しない」理由は、チャンク終端の…
Hello there, ('ω')ノ 背景の直感(なぜ動くのか、噛み砕いた説明) HTTP/1.1 では「リクエストの終わり」を決める方法が主に Content-Length(ボディのバイト長を明示)と Transfer-Encoding: chunked(チャンクで区切る)の 2 種類あります。 フロント(ロ…
Hello there, ('ω')ノ 概要:発生の根本原因(短く一言で) HTTP/1.xがリクエストの終端(どこで1つのリクエストが終わるか)を指定する方法を複数持っていて、それらが矛盾したり、フロントエンドとバックエンドで扱いが異なるために生じる曖昧さがリクエス…
Hello there, ('ω')ノ 前提:扱うサンプル(行末は \r\n と数えます) クライアントがフロントに送った文字列(省略せず可視化): POST / HTTP/1.1\r\n Host: vulnerable\r\n Content-Length: 20\r\n Transfer-Encoding: chunked\r\n \r\n 0\r\n \r\n GET /…
Hello there, ('ω')ノ 全体像(何が起きるのか) 汚染源:アドレス変更フォームの JSON をそのままサーバオブジェクトへマージしている 検知の合図:"__proto__": {"json spaces": 10} を入れると、レスポンス JSON のインデントが増える ガジェット:メンテ…
Hello there, ('ω')ノ なぜ成立する?(まず“絵”を持つ) アプリは、忘れたパスワード処理でサーバー側から内部APIにHTTPリクエストを発行しています。ここで username がそのまま URLパスの一部に使われていると、 ?(クエリ開始)や #(フラグメント開始)…
Hello there, ('ω')ノ 全体像(まず“絵”を掴む) トップ(/)は時々 バックスラッシュを正規化して /setlang\es → 302 → /setlang/es を返す。 → 302がキャッシュ可能なので、ホームを踏んだ人全員を /setlang/es に押し出せる(=強制的に lang=es クッキー…
Hello there, ('ω')ノ 全体像(何がどう繋がる?) /login のリダイレクトが不備 クエリの utm_content をキャッシュキーから除外する正規表現が甘い。 これにより lang=en?utm_content=... の後ろに未キー化のパラメータ列を実質追記できる(=unkeyed appe…
Hello there, ('ω')ノ なぜこの攻撃が成立するのか(最初に“絵”をつかむ) チャットUIは LLMが生成したテキストを innerHTML 的に描画している。 → 出力のサニタイズ不足。 LLM は product_info のような 関数(ツール)経由で「商品名やIDを渡すとレビュー…
Hello there, ('ω')ノ 全体像(最短ロードマップ) 攻撃面の発見:LLM がどの API(機能)を呼べるか確認 ログイン必須性の確認:Edit Email がログイン中アカウントに無条件で効くか試す 経路の特定:チャット回答に商品レビュー引用が混ざることを確認 隠…
Hello there, ('ω')ノ Burp Collaborator は、セキュリティ診断ツール Burp Suite に含まれる「外部通信を観測するための仕組み」です。 アプリが脆弱性によって こっそり外部に通信していないか を確認するために使われます。 どんな時に使うのか? 攻撃者…
Hello there, ('ω')ノ 目的:HTML フィルター(HTMLJanitor)の抜け穴を DOM Clobbering で突き、print() を実行させる。 想定ブラウザ:Chrome 推奨(この手法は Firefox では想定通り動かないことがある) 全体の進め方(非エンジニア向けの道筋) まず観…
Hello there, ('ω')ノ まず理解すべきポイント HTML フィルターが属性を制御している HTMLJanitor は不正な属性(例: onload や onclick)を削除して安全化する仕組み。 → しかし内部的に attributes プロパティに依存している。 DOM Clobbering とは? HTM…
Hello there, ('ω')ノ 1. 通常のDOMの仕組み HTML要素には id や name を付けられます。 例えば: <input id="user"> するとJavaScriptからはこうアクセスできます: document.getElementById("user"); // <input id="user"> これは普通の動きです。 2. プロパティと名前が衝突するケース ブラ…
Hello there, ('ω')ノ 背景 アプリケーションは「製品レビュー」を LLM に読み込ませ、ユーザーの質問に答える仕組み。 問題は LLMの最終出力がブラウザにそのまま描画される こと。 攻撃者が細工したコメントを残すと、LLMがそれを回答に含めてしまい、結果…
Hello there, ('ω')ノ 脆弱性報告レポート タイトル: Insecure Direct Object Reference によるチャットログからのパスワード漏洩 ✅ 概要(Summary) チャットログ閲覧機能が 連番ファイル名を直接指定できる静的 URL で管理されており、他ユーザのトランス…
Hello there, ('ω')ノ なぜ $(whoami) を使うのか(Step 4 の理由) 最小の副作用で RCE を立証できるから whoami は 読むだけ のコマンド。ファイル破壊や設定変更を伴わず、まずは 「本当に OS コマンドが実行されたのか」 を安全に確かめられます。 観測…
Hello there, ('ω')ノ 動画 www.youtube.com ねらい(ゴールを一言で) このラボは、チャットLLMが内部のAPIを“自律実行”できる設計(過剰エージェンシー)を足がかりに、メール購読APIの処理に潜むOSコマンドインジェクションを突き、/home/carlos/morale.t…
Hello there, ('ω')ノ 動画 youtu.be ねらい このLABは、サイトに埋め込まれたチャットLLMが外部機能(API/ツール)を自律実行できる設定(= 過剰エージェンシー)を突き、LLMにデータベース操作APIを呼ばせてcarlosユーザーを削除させるのがゴールです。ポ…
Hello there, ('ω')ノ DOMで追加された要素はなぜ「ソース」に無いのに「Elements」では見えるのか document.write と DevTools で読み解く表示の流れ この記事では、次の2点をセットで解説します。 - 要素(Elementsパネル)にあるのに、ページのソースには…
Hello there, ('ω')ノ 動画 www.youtube.com ねらい 検索ページが、URLのクエリ(location.search)をそのままdocument.writeでページに書き込んでいます。これにより、検索語がタグや属性の中へ無加工で挿入され、XSSが成立します。ゴールはalert(1)を出す…