Portswigger-Web cache poisoning with an unkeyed header

problem link

풀이

웹 캐시의 unkeyed 헤더를 안전하지 않게 핸들링하여 웹 캐시 포이즈닝 취약점이 있다. 유저가 약 1 분에 한 번씩 홈페이지를 방문할 때, 방문자의 브라우저에 alert(document.cookie)를 실행시켜라.

Burpsuite의 Param Miner의 Guess Headers를 실행한다. 몇 가지 숨겨진 헤더를 발견해 알려준다.

그리고 Cache poisoning이 가능한 헤더도 알려준다. 원래 Request에는 보내지 않던 x-forwarded-host 헤더에 zwrtxqva 라는 임의의 값을 넣고 테스트했는데 이것이 반사된다는 것을 찾았다.

Secret input 알림에서 Compare Responses를 누르면 헤더를 바꿨을 때 다르게 응답한 것을 비교할 수 있다. x-forwarded-host의 값이 자바스크립트 링크 URL을 동적으로 생성하는 데 사용되었다.

또한 X-Cache 헤더를 통해 이 데이터가 캐시로부터 왔는지 아닌지 등도 알 수 있다.

<<세션 초기화로 문제 URL 변경됨>>

문제 상단의 Go to exploit server를 클릭하면 웹서버 반응을 만들 수 있다. x-forwarded-host값/resources/js/tracking.js 경로로 URL을 생성하므로, /resources/js/tracking.js 경로에 접근했을 때 실행할 자바스크립트 코드를 지정한다.

그리고 x-forwarded-host 값으로 acb81f751ebeaabd803436e1014b003a.web-security-academy.net 을 넘기면 스크립트를 가져오는 URL을 조작하여 위 스크립트를 가져올 수 있다.

캐시 포이즈닝을 한 페이지에 접속해보면 XSS가 실행되는 것을 볼 수 있다.

공격을 테스트하는 동안 실 유저에 영향을 끼치지 않도록 URL에 파라미터를 넣은 것을 삭제하고(cache buster를 삭제하고), 실제 사용자가 접근할 수 있는 페이지를 포이즈닝하면 성공이다.

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


tags: writeup, web-cache-poisoning, xss, business-logic-vul, wstg-busl-02, host-header-injection, wstg-inpv-17, web hacking