ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Study] LINE CTF 2023 Adult Simple GoCurl
    CTF/LINE CTF 2023 2023. 3. 27. 23:13

    Simple 문제(https://vardy.tistory.com/262)의 업그레이드 버전이다.

     

    취약점이 존재했던 필터링 로직이 수정되어, X-Forwarded-For 혹은 X-Real-IP 헤더를 사용하여 c.ClientIP()의 값을 제어하는 기존 방법으로는 플래그를 획득 할 수 없다.

    if strings.Contains(reqUrl, "flag") || strings.Contains(reqUrl, "curl") || strings.Contains(reqUrl, "%") {
    	c.JSON(http.StatusBadRequest, gin.H{"message": "Something wrong"})
    	return
    }

     

    어쨌든 헤더 삽입 관련 내용이기 때문에 관련해서 수많은 삽질을 하다가 문제를 풀지 못했는데 풀이는 X-Forwarded-For, X-Real-IP 외 또 다른 헤더를 사용하는 것이었다.

     

    X-Forwarded-Prefix 라는 헤더인데, 원래는 프록시를 통해 접근할 때 삭제된 경로에 대한 내용인 듯 했다. 

     

    https://github.com/gin-gonic/gin/issues/2916

     

    Respect the X-Forwarded-Prefix header (for redirects) · Issue #2916 · gin-gonic/gin

    TL;DR Add support for the X-Forwarded-Prefix for improved support for reverse proxies. Redirects should always be relative to X-Forwarded-Prefix, not only in RedirectTrailingSlash. Description Redi...

    github.com

    위 내용을 보면 X-Forwarded-Prefix 헤더 사용 시 최상단의 경로 하나가 삭제되어 인식하는 현상이 발생 함을 알 수 있다.

     

    이를 응용하면, http://127.0.0.1:8080// 와 같이 최상단 / 에 / 를 하나 더 추가하여 //로 설정하고

    X-Forwarded-Prefix: /flag 로 설정해주면 최상단 경로가 하나 삭제되고 flag가 반영된 경로로 인식하여 서버가 /flag에 접근하도록 유도 할 수 있을 것이다.

    즉 헤당 헤더 셋팅을 해주면

    http://127.0.0.1:8080//flag/ 처럼 Prefix 처리가 된 후에 최상단 경로가 삭제되어

    http://127.0.0.1:8080/flag/ 로 요청이 될 것이다.

     

    참고로,

    http://127.0.0.1:8080// 이 아닌 http://127.0.0.1:8080/ 로 url을 설정하면,

    http://127.0.0.1:8080/flag 가 된 뒤에 최상단 경로가 삭제되어 http://127.0.0.1:8080/ 로 요청되어 /flag가 아닌 main페이지에 대한 응답이 출력된다.

     

    이번 문제에서는 실제로 입력 url에 대해 리다이렉트될때 사용해야하므로 /curl/ 요청 시 헤더를 삽입하는 것이 아닌, 기능에서 제공하는 header_key, header_value를 활용해야 하므로 아래와 같이 플래그를 획득 할 수 있다.

    FLAG = LINECTF{b80233bef0ecfa0741f0d91269e203d4}

    반응형

    'CTF > LINE CTF 2023' 카테고리의 다른 글

    [Clear] LINE CTF 2023 Baby Simple GoCurl  (0) 2023.03.26

    댓글

Designed by Tistory.