Portswigger-Web cache poisoning with an unkeyed cookie

problem link

풀이

쿠키를 캐시 키에 포함하지 않아 웹 캐시 포이즈닝 취약점이 있다. 유저가 약 1 분에 한 번씩 홈페이지를 방문할 때, 방문자의 브라우저에 alert(1)를 실행시켜라.

fehost라는 쿠키에 prod-cache-01 라는 값이 설정된다. 이는 Response에서 다음과 같은 내용으로 반사된다. 프론트의 캐시 서버나 설정 등을 의미하는 것 같다. Comparer를 이용하여 비교하면 편하다.

<script>
    data = {
        "host":"ac5d1f741f904ec680410fd80045001b.web-security-academy.net",
        "path":"/",
        "frontend":"prod-cache-01"
    }
</script>

반사되는 곳에 XSS 페이로드를 끼워넣는다. 앞의 fehost="}-alert(1)-{"test":" 페이로드를 이용했다. “를 종료하고, }를 끼워넣어 data 오브젝트를 종료한다. 그리고 빼기 연산자를 이용해 alert 함수를 실행하도록 연결한다. (; 문자를 만나면 이후 입력을 받지 않고 종료했기에 이를 우회했다) 그리고 뒤쪽에 잘린 ”} 문자를 처리하기 위해 새로운 오브젝트를 만들어 빼기 연산자로 연결한다.

(굳이 이렇게 하지 않고 frontend":"someString"-alert(1)-"someString" 형태로 만들어도 괜찮았다..)

cache buster로 넣은 파라미터를 삭제하고, / 경로에 캐시 포이즈닝을 하면 성공한다.

이 취약점은 사용자가 조작할 수 있는 쿠키를 그대로 믿고 사용해서 발생했다. 또한 웹 캐시 포이즈닝을 통해 self XSS를 다른 사용자에게 영향을 끼칠 수 있는 문제로 끌어올렸다.


tags: writeup, web-cache-poisoning, xss, reflected xss, wstg-inpv-01, business-logic-vul, wstg-busl-02, web hacking