【HTTPリクエストスマグリング編】境界の解釈ズレを突く攻撃と守り方|CTF思考フレームワーク #18
こんにちは、アンペンです!
前回は、XMLの外部実体参照を悪用するXXEを扱いました。
今回は、フロントエンド(CDN・LB・プロキシ)とバックエンドサーバの「リクエスト解釈のズレ」を突くHTTPリクエストスマグリングを見ていきます。境界の解釈ズレを突く攻撃と、その守り方を一緒に見ていきましょう。

リクエストを密輸する、ってどういうこと?

フロントエンドとバックエンドで『1つのリクエストの終わり』をどこと判定するかがズレると、隙間に第2のリクエストを忍ばせられるんだ。後続の利用者のリクエストに紛れて悪用されることもある。
ここから少しだけ歯ごたえのある話になります。HTTPリクエストスマグリング——名前からして難しそうですよね。でも芯にあるのは、とても素朴な問題です。『1通の手紙はどこで終わるか』を、入口の係と奥の係が違う場所で判断してしまう、ただそれだけ。今日は共同郵便受けの“仕切り違い”にたとえて、この“見えない攻撃面”をほどいていきます。
HTTPリクエストスマグリングは、フロント(CDN/LB/プロキシ)とバックエンドでHTTPの境界解釈が食い違うことで起きます。Content-LengthとTransfer-Encodingの両方を扱う混在経路では、後続ユーザーのリクエストが乗っ取られる被害につながります。
この記事で分かること
- HTTPの「境界」(リクエストの終わり)がどう決まっているか
- CL.TE / TE.CL / TE.TE の3つの代表型
- フロントとバックでパーサを揃える守り方
📖 はじめてのWebセキュリティ #18|HTTPリクエストスマグリング編
『中継装置の解釈差』が、なぜ第三者の通信を乗っ取れるのかを優しく学びます。 シリーズ一覧を見る →
⚠️ 大事なお約束
この記事の確認は、CTF・公式ラボ・自分で作った検証環境だけで行ってください。実在するサービスにスマグリング用ペイロードを送る行為は、不正アクセスや業務妨害に該当する可能性があります。
「リクエストの終わり」はどう決まるか
HTTPはひとつのコネクションで複数のリクエストを連続して送る仕組み(Keep-Alive)を持っています。だから、サーバは「ここまでがリクエスト1、ここからはリクエスト2」という境界の判定が必要です。
境界の判定には主に2つのヘッダが使われます。 Content-Length(本文の長さを指定)と、 Transfer-Encoding: chunked(チャンク終端で判定)です。フロントとバックエンドが違う基準で判定すると、解釈にズレが生まれます。
問題は、この“区切り線の引き方”が2通りあることです。一つは「本文はこの長さですよ」と長さで申告する方法(Content-Length)。もう一つは「ここで終わり、という合図を入れますね」と終端マークで知らせる方法(Transfer-Encoding)。どちらも正しい方法なのですが、入口の装置と奥のサーバが“別々の方法”を信じてしまうと、引かれる区切り線の位置がズレる。その一瞬のズレが、攻撃者のつけ入る隙になるんです。
そもそも、なぜ『境界』なんてものが問題になるのでしょう。実は今どきのWeb通信は、効率のために一本の通信路で何通ものリクエストを立て続けに送ります(Keep-Aliveという仕組み)。手紙を一通ずつ封筒に入れて送るのではなく、長い巻物に何通分も続けて書いていくイメージです。だからこそ受け取る側は「ここまでが1通目、ここからが2通目」という“区切り線”を、自分で正しく引く必要があるんです。
図解:境界一致 vs 境界ズレ

境界が一致していれば普通の通信ですが、ズレていると「フロントは1リクエスト」「バックは1.5リクエスト」のように見えて、隙間に攻撃用ペイロードが残ります。

マンションの共同郵便受けで、1階の係と各戸の住人で「ここまでが1通分の手紙」という仕切りの場所がズレていたら、本来別人宛だった文章の冒頭が、自分の手紙の続きとして読まれてしまうかもしれません。HTTPスマグリングは、まさにこの『仕切り違い』が中継装置とバックエンドの間で起きる現象です。
ここで覚える用語:CL.TE / TE.CL / TE.TE
HTTPスマグリングの3つの代表型を指す呼び方です。CLは Content-Length、TEは Transfer-Encoding の略です。フロントとバックエンドのどちらがどちらを優先するかの組み合わせで、攻撃者が境界をどうずらすかが決まります。
『CL.TE』『TE.CL』なんて記号が並ぶと身構えますが、読み方は単純です。ピリオドの前が“入口(フロント)が信じる方”、後ろが“奥(バック)が信じる方”。たとえばCL.TEなら「フロントは長さ(CL)を信じ、バックは終端マーク(TE)を信じる」という意味です。つまり“誰がどっちを信じてズレるか”の組み合わせを名前にしているだけ。そう分かると、急に親しみやすくなりますよね。
代表的な3つの型
代表的なズレ方は3つ。フロントが長さ派でバックが終端派の『CL.TE』、その逆の『TE.CL』、そして両方とも終端派だけど“崩した書き方”の解釈が違う『TE.TE』。細かい挙動はさておき、「入口と奥で、信じる物差しが食い違っている」という一点だけ押さえれば十分です。
CL.TE / TE.CL / TE.TE

- CL.TE:フロントが
Content-Length、バックがTransfer-Encodingを優先するパターン - TE.CL:フロントが
Transfer-Encoding、バックがContent-Lengthを優先するパターン - TE.TE:両方とも
Transfer-Encodingを見るが、混在/不正な書式に対する解釈が異なるパターン
これらが成立すると、攻撃者は「フロントは正規のリクエストだと判断」「バックは続きに第2のリクエストがある、と判断」という状態を作り、後続の正規ユーザーのリクエストに第2のリクエストを混ぜ込めます。
ここがスマグリングの一番こわいところです。被害に遭うのは、攻撃者自身ではなく“次にそのサーバを使った、まったく無関係な利用者”なんです。攻撃者が仕込んだ「区切り線の先の半端なリクエスト」が通信路に居残り、次にやってきた人の正規リクエストの“頭”にくっついてしまう。結果、その人のリクエストが攻撃者の用意した内容に書き換わったり、応答がすり替わったり。自分は何もしていないのに巻き込まれる——だからこそ、見えにくく、影響が大きい攻撃なんです。
この攻撃は中継装置が絡むので、自分のラボで“環境ごと”再現するのが理解の近道です。ねらいは攻撃の成功ではなく、「入口とサーバ、それぞれのログで、リクエストがいくつに見えているか」を見比べること。本物の中継装置やサービスに細工リクエストを送るのは、業務妨害になりかねないので厳禁です。あくまで自分で建てた練習環境の中で観察しましょう。
CTFでやってみよう:HTTPヘッダ解釈を観察する
自分のラボで、ヘッダ解釈の挙動を確認しよう
目的は実際の攻撃ではなく、「フロントとバックがどの基準で境界を判定しているか」を意識することです。
- CTFや自分の検証環境で、フロントエンド(リバプロや簡易CDN)とバックエンドの組み合わせを用意する
- Content-Length と Transfer-Encoding を両方含めたテストリクエストを送り、応答ログを比較する
- フロント側ログ・バック側ログそれぞれで「リクエストがいくつに見えているか」を観察する
- HTTP/2やHTTP/1.1の使い分けが境界判定にどう影響するか確認する
- WAFやCDN設定で「不正なヘッダ組合せ」を拒否する機能を確認する
守りの方針は、原因を思い出せばまっすぐ見えてきます。原因は“物差しの食い違い”でしたよね。

じゃあ、入口と奥で“同じ物差し”を使えば防げるってこと?

その通り!フロントとバックのHTTPの読み方(パーサ)をそろえて、バージョンも合わせる。これが一番効くんだ。さらに、長さと終端マークの両方が書いてある“欲張りな”リクエストは、入口できっぱり拒否する。最近はフロントから奥までHTTP/2で統一する手も有効だよ。要は『区切り線の引き方を、全員で一致させる』ことなんだ。
守る側なら、「境界をひとつに揃える」を徹底
HTTPスマグリングの守りは、「フロントとバックでHTTP解釈を揃える」「不正なヘッダ組合せを拒否する」が基本です。HTTP/2を末端まで使うのも有効な対策です。
- フロント(CDN/LB/Reverse Proxy)とバックエンドのHTTPパーサ実装を揃え、最新版を使う
- Content-LengthとTransfer-Encodingが両方ある不正リクエストは、フロント側で拒否する
- 可能ならフロント-バック間をHTTP/2(または最新のHTTP/3)で統一する
- WAFで
Transfer-Encodingの不正値や重複ヘッダを検知・ブロックする - 長寿命のKeep-Alive接続を短くし、後続リクエストへの影響範囲を狭める
- 定期的にPortSwigger等の最新研究を確認し、新型のスマグリング手法を追う

『装置同士の解釈差』っていう、人間からは見えにくい攻撃面なんだね。

そう。だから『フロントとバックの実装・バージョンを揃える』運用が、何より効くんだ。
ここまでをひと言で言うと、スマグリング対策は『関係する全員が、同じ物差しで区切る』こと。コードの中の穴というより、装置と装置の“すきま”に生まれる問題なので、守りも個々のアプリではなく“経路全体の足並み”をそろえる発想になります。装置の実装とバージョンをそろえる、という地味な運用が、ここでは何より効きます。
まとめ:『境界をひとつに』が中継のセキュリティ
- HTTPスマグリングは中継装置とバックの境界判定差を突く攻撃
- CL.TE / TE.CL / TE.TE の3型が代表的
- 守りはパーサ統一+不正ヘッダ拒否+HTTP/2末端まで
- WAFや監査ログでヘッダ異常を見続ける運用も大切
今日の持ち帰りは『1通の終わりは、全員で一致させる』です。HTTPリクエストスマグリングは少し上級ですが、根っこは郵便受けの仕切り違いと同じだと分かれば、もう怖くありません。長さと終端マーク、どちらの物差しもズレなく一致させる——その当たり前を経路全体で徹底することが、見えない密輸を防ぐ鍵になります。
次回は、CDNの動作を悪用して別ユーザーに有害コンテンツを配るWebキャッシュ汚染を扱います。CDNを毒で塗る攻撃と守り方を見ていきましょう。
