Webの仕組みをCTF視点でおさらい
HTTP・URL・Cookie・ステータスコード——Web問題を解く土台を固めよう
第3話でflagの形式と点数の仕組みを理解しました。ここから第2章(Web編)に入ります。Web問題はCTFで最も出題数が多いジャンルのひとつです。問題を解くには、まずブラウザとサーバーが「どうやって会話しているか」を知っておく必要があります。
この記事では、HTTP・URL・Cookie・ステータスコードという4つのWeb基礎を、CTFで役立てるための視点を交えながら解説します。すでにWebの基礎知識がある方も、「CTFではここに注目する」という角度から読み直すと発見があるはずです。
🌐 HTTPとは何か
ブラウザとサーバーの「会話プロトコル」
HTTP = ブラウザとサーバーが会話するためのルール
HTTP(HyperText Transfer Protocol)は、WebブラウザとWebサーバーがデータをやり取りするための通信規約(プロトコル)です。あなたがブラウザにURLを入力してEnterを押した瞬間から、裏側ではHTTPの「会話」が始まっています。
🔄 HTTPリクエスト/レスポンスの流れ
HTTPには「メソッド」という概念があり、最もよく使われるのがGET(ページやデータを取得する)とPOST(フォームのデータなどを送信する)です。CTFのWeb問題では、このGET・POSTを意図的に書き換えることで脆弱性を突くパターンが頻出します。GETのパラメーターはURLに直接見えているため、開発者ツールのNetworkタブやURLバーで確認できます。POSTはURLには現れませんが、NetworkタブのRequest Bodyとして確認可能です。
URLが https:// で始まる場合は、通信内容がTLSによって暗号化されています。http://(sなし)は平文通信なので、通信経路上で内容を盗み見られる可能性があります。CTFでは学習用に http:// のサーバーが用意されることもありますが、実際のWebサービスでは必ずHTTPSを使うことが基本です。
🔗 URLを解剖する
各パーツの意味を知ると問題が解きやすくなる
URLは単なる「サイトのアドレス」ではなく、複数のパーツが組み合わさった構造を持っています。CTFのWeb問題では、URLのどの部分を操作するかによって解き方が変わるため、各パーツの意味を理解しておくことが重要です。
🔍 URLの構造
CTFのWeb問題でとくに注目すべきはクエリ文字列(?key=value の形式)です。ログインフォームの入力値や検索キーワードはクエリ文字列としてサーバーに送られることがあり、ここを意図的に書き換えることでSQL Injectionのような脆弱性が生まれます。たとえば ?id=1 を ?id=1 OR 1=1-- のように改ざんするのがSQL Injectionの基本パターンです(詳細は第8話で解説)。
フラグメント(#以降)はサーバーに届かない
URLの # 以降の部分(フラグメント)はブラウザだけで処理され、サーバーには送信されません。そのため、フラグメントを使った情報はNetworkタブでは見えません。CTFでは意図的にこの性質を利用した問題も存在します。
🍪 CookieとセッションのCTF的な意味
ブラウザに保存される情報をCTFはどう見るか
Cookieとは「ブラウザに保存される小さなメモ」
Cookie(クッキー)は、Webサーバーがブラウザに「覚えておいてほしいこと」を保存する仕組みです。たとえばショッピングサイトでログインした状態を維持したり、カートの中身を保持したりするために使われています。ブラウザはリクエストのたびにこのCookieをサーバーへ自動的に送り返します。
CTFのWeb問題でCookieが重要視される理由は2つあります。第一に、Cookieにはユーザーのログイン状態(セッションID)が入っていることが多く、これを盗んだり偽造したりすることでなりすましができてしまう場合があります。第二に、問題によってはCookieの中に直接flagが隠されているケースがあります。今回のミニチャレンジもまさにそのパターンです。
CookieはDevToolsのApplicationタブで確認できる
開発者ツール(F12)の「Application」タブを開き、左サイドバーの「Cookies」からページのURLを選択すると、現在セットされているCookieの一覧(名前・値・有効期限など)を確認できます。第2話で紹介した4タブ表の「第6話以降」でApplicationと記載しましたが、今回から少し早めに体験してみましょう。
Cookieには HttpOnly や Secure などの属性を付けることで、JavaScriptからのアクセスを禁止したり、HTTPS通信時のみ送信するように制限したりできます。CTFではこれらの属性が意図的に外されている問題があり、JavaScriptで document.cookie を実行するだけでCookieの値を読み取れてしまいます。セキュリティの視点から見ると、これは非常に重大な設定ミスです。
📋 HTTPステータスコード早見表
サーバーの「返事」を読み解く
HTTPレスポンスには必ず「ステータスコード」と呼ばれる3桁の数字が含まれています。この数字が「サーバーの返事」を表しており、CTFでNetworkタブを確認する際に必ず目にします。代表的なものを覚えておきましょう。
| コード | 意味 | CTFでの見どころ |
|---|---|---|
| 200 OK | リクエスト成功 | 正常なレスポンス。ヘッダーや本文にflagが潜む |
| 301/302 | リダイレクト | 元のレスポンス本文にflagが入ってる問題が稀にある |
| 403 Forbidden | アクセス禁止 | 「禁止されている」ページを迂回するのがWeb問題の定番 |
| 404 Not Found | ページが存在しない | 隠しページを探すヒントになることも |
| 500 Internal Server Error | サーバーエラー | エラーメッセージにサーバー情報が漏れることがある |
CTFでよく出る「403を迂回する」問題
管理者ページ(/adminなど)が403で弾かれているとき、リクエストヘッダーに X-Forwarded-For: 127.0.0.1 を追加したり、HTTPメソッドをGETからPOSTに変えたりすることでアクセスできてしまう問題がよく出題されます。これはサーバー側のアクセス制御が不完全なことを示す脆弱性です。
🧩 5分CTFチャレンジ
ApplicationタブでCookieを覗いてみよう
このページを開いた瞬間、JavaScriptが自動的にブラウザにCookieをセットしました。開発者ツールの「Applicationタブ」を開いて、そのCookieの値からflagを見つけてください。
探し方の手順
①F12で開発者ツールを開く → ②「Application」タブをクリック → ③左サイドバーの「Cookies」を展開してURLを選択 → ④ ctf_ep04 という名前のCookieを探して、その「Value」列の値を読む → ⑤値をそのまま下のフォームに入力して送信!
このページが読み込まれると同時に、ブラウザの Cookie に合言葉がセットされています。開発者ツールの「Application」タブ → 「Cookies」でその値を確認して入力してください。
F12で開発者ツールを開いた後、上部のタブ一覧から「Application」を探してください(見えない場合は「≫」ボタンで隠れたタブを展開)。
Applicationタブの左側に「Storage」セクションがあり、その中に「Cookies」があります。展開すると現在のページのURLが表示されるのでクリック → ctf_ep04 を探してください。または Console タブで document.cookie と入力するとすべてのCookieが表示されます。
📝 まとめ+次回予告
今回のポイントを振り返ろう
第4話ではHTTP・URL・Cookie・ステータスコードというWebの基礎をCTF視点で整理しました。これらは次話以降の実践問題で繰り返し登場する概念です。特にCookieとクエリ文字列は、Web問題の攻撃対象として最頻出なので、仕組みをしっかり押さえておきましょう。
・HTTPはブラウザ↔サーバー間の通信規約。GET(取得)とPOST(送信)が基本
・URLはスキーム・ホスト・パス・クエリ・フラグメントで構成される
・CTFではクエリ文字列(?key=value)が最も狙われやすいポイント
・CookieはApplicationタブで確認可能。セッションIDやflagが潜むことがある
・ステータスコードの意味(200/301/403/404/500)を覚えておくとNetworkタブが読みやすくなる
Q. GETとPOSTはどう使い分けるのですか?
GETはURLにパラメーターが見える形で情報を送り、主にページの取得に使います。POSTはリクエスト本体(Body)に情報を入れて送るため、ログインフォームやファイルアップロードのような「サーバーに変更を加える操作」に向いています。CTFではBurp Suiteを使ってGETをPOSTに書き換えるだけで解けてしまう問題も存在します。
Q. Cookieを盗まれると何が起きますか?
Cookieに含まれるセッションIDを盗まれると、攻撃者はそのIDを使って被害者のアカウントにログインした状態を再現できます(セッションハイジャック)。これを防ぐために HttpOnly 属性(JavaScriptからの読み取りを禁止)や Secure 属性(HTTPS通信時のみ送信)を付けることが推奨されています。
Q. 403 Forbiddenと401 Unauthorizedの違いは?
401はログインが必要なリソースにログインせずアクセスした状態(認証エラー)、403はログインはしているがそのリソースへのアクセス権限がない状態(認可エラー)です。CTFでは403を返すエンドポイントに対して、リクエストヘッダーを工夫することでアクセスできてしまうパターンの問題がよく出ます。
Q. Networkタブで通信を見るには何かインストールが必要ですか?
不要です。Networkタブは開発者ツール(F12)に標準搭載されており、ページを読み込んだりボタンを押したりするだけで通信の記録が蓄積されます。次話以降の問題で実際に使う機会があるので、今回Applicationタブを体験しながら場所を覚えておきましょう。
HTMLを書き換えてみよう|Elementsタブ実践
開発者ツールのElementsタブで一時的にページのHTMLを書き換え、表示をごまかす問題に挑戦します。
📚 参考情報
- MDN Web Docs「HTTP の概要」(Mozilla)
- RFC 9110 — HTTP Semantics(HTTPプロトコルの仕様書)
- 各ブラウザの開発者ツール公式ドキュメント

コメント