コース目次 / 第0章

はじめに — 検査用サーバを立てる

なぜ HTTP を手で組むのかを確認し、送ったリクエストをそのまま返してくれる小さな検査用サーバを 127.0.0.1 に立てます。

第0章 / 全4章目安 約8分この章のゴール: リクエストの中身を見せてくれる検査用サーバをローカルに立て、手で HTTP を送る準備をする

Web 診断は、突きつめれば「HTTP リクエストを、思い通りに組み立てて送る」ことの繰り返しです。ブラウザはこれを裏で自動でやってくれますが、診断では自分の手で、一行ずつ組みます。パラメータを1つ変えて再送する、ヘッダを1つ足す——その細かい操作が、穴を見つける動作そのものだからです。

法と倫理ゲート

手を動かす前に

このコースは攻撃の技術に触れます。実習してよい相手は、次の3つだけです。

  • (a) 自分で作った練習用のやられ環境(このサイトが配る自作ターゲット)
  • (b) あなた自身の許可された環境(自分の Thousand SKY・secret-notes-ctf など)
  • (c) CTF 競技の中(規約の範囲で)

実在する第三者のシステムを許可なく触ることは、不正アクセス禁止法に触れます。 このゲートは、その線引きを毎回の入口で確かめるためのものです。詳しくは「セキュリティの法と倫理」へ。

このコースの練習相手は、あなたのパソコンの中に立てる検査用サーバだけです。実在の他人のサイトには送りません。

検査用サーバを作る

送られてきたリクエストの中身を、そのまま JSON で見せ返してくれる小さなサーバを作ります。エディタで echo.mjs という名前で保存してください。

import http from 'node:http';
const HOST = '127.0.0.1', PORT = 4610;
http.createServer((req, res) => {
  let body = '';
  req.on('data', (c) => (body += c));
  req.on('end', () => {
    const report = { method: req.method, path: req.url, headers: req.headers, body: body || null };
    res.writeHead(200, { 'content-type': 'application/json; charset=utf-8' });
    res.end(JSON.stringify(report, null, 2));
  });
}).listen(PORT, HOST, () => console.log(`echo が http://${HOST}:${PORT} で起動`));

127.0.0.1 に固定してあるので、このサーバはあなたのパソコンの外からは見えません。起動します。

node echo.mjs
echo が http://127.0.0.1:4610 で起動

送ってみる

別のターミナルで、curl でアクセスします。

curl -s "http://127.0.0.1:4610/hello?name=alice"
{
  "method": "GET",
  "path": "/hello?name=alice",
  "headers": {
    "host": "127.0.0.1:4610",
    "user-agent": "curl/8.7.1",
    "accept": "*/*"
  },
  "body": null
}

いま自分が送ったリクエストの中身が、そっくり返ってきました。これから章を追って、この JSON の一つ一つ——メソッド、パス、ヘッダ、Cookie、ボディ——を手で書き換えていきます。次章は、いちばん外側の骨組み、メソッドとヘッダからです。

こうなっていればOK

卒業まであと3章です。

この章はまだ完了していません。