コース目次 / 第0章
はじめに — 検査用サーバを立てる
なぜ HTTP を手で組むのかを確認し、送ったリクエストをそのまま返してくれる小さな検査用サーバを 127.0.0.1 に立てます。
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章です。
この章はまだ完了していません。
保存できませんでした(プライベートブラウズ中かもしれません)。この端末に進捗は残りませんが、先へは進めます。