Cache Busting과 보안 테스팅

Cache busting

Cache busting은 보안쪽 테스팅에서 먼저 나온 개념은 아니고, 개발쪽에서 많이 사용되던 개념입니다. 웹 브라우저는 빠른 동작과 효율성을 위해서 리소스등을 캐시하고 있는데, 일반 사용자가 캐시를 리로드하는건 불편한 일입니다. (일반 사용자가 평상시에 hard refresh를 하진 않죠)

그래서 아래와 같이 특정 파라미터 등을 통해 항상 캐시되지 않은 정보를 받아오도록 유도하는 기술이 Cache busting입니다.

https://www.hahwul.com/scss/style.min.css?t=1629973342
https://www.hahwul.com/scss/style.min.css?t=1629973402

어떤 서비스는 버전 별로 busting을 하기도 합니다.

https://www.hahwul.com/scss/style.min.css?v=1
https://www.hahwul.com/scss/style.min.css?v=2

어쨌던 정리하면 캐시되지 않고

Hard refresh

아까 위에서 hard refresh란 이야기를 했는데, 이는 웹 브라우저에서 제공하는 기능을 의미합니다. 보통 개발자 도구를 연 상태에서 refresh 버튼을 특정 키(e.g command)와 같이 눌렀을 때 나타나는 강력 새로고침을 의미합니다.

chrome
- windows
 - ctrl + reload button
 - ctrl + fn + f5
 - 개발자도구 열려있는 상태에서 reload 버튼 우클릭
- mac
 - Shift 누르고 reload
 - Command + Shift + R

Firefox
- windows
 - ctrl + fn + f5
 - ctrl + shift + R
- mac
 - shift + reload
 - Command + shift + R

Safari
- Shift + reload
- Command + Option+ R

For security testing

그럼 보안 테스팅에선 언제 사용해야할까요? 맨 처음 이야기드렸듯이 캐시가 테스팅에 방해될 수 있는 모든 부분에서 사용할 수 있습니다. 방해라고 하면 캐시로 인해서 공격 성공을 체크하기 어려운 부분이거나 CDN 등 Global cache 발생시켜 타 사용자에게 영향을 줄 수 있는 부분들을 방지하고자 사용합니다.

(물론 캐시 포이즈닝을 실제로 악용한다면 busting 하지 않겠죠)

Smuggling

스머글링에선 원본 요청에서 cache busting을 사용하면 됩니다. 아래 코드에선 hahwul_cb1234=423488게 cache busting이 되겠죠.

POST /test_page?hahwul_cb1234=423488 HTTP/1.1
Host: ******
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 44
Transfer-Encoding: chunked

0

GET /server-status HTTP/1.1
X-Ignore: jjj

이 때 주의할점은 Cache busting은 파라미터 값보단 파라미터 명으로 하는게 충돌을 막을 가능성이 높아서, 두개를 혼용하시는 걸 추천합니다. 그리고 백엔드의 캐시 정책에 따라 다르겠지만 Vary 헤더 등으로 정보를 얻을 수 있는 경우 이를 활용해서 Cache busting을 사용하는 것도 좋습니다.

Cache poisoning

캐시 포이즈닝 또한 캐싱을 진행하는 대상에 파라미터 등을 추가하여 타 사용자가 영향받지 않게 캐시 포이즈닝을 할 수 있습니다.

GET /test-js.min.js?hahwul_cb15555=1241 HTTP/1.1
Host: ******
Cache-Control: max-age=9999999
Access-control-allow-origin: cached.hahwul.com
Accept-Encoding: gzip, deflate

회사에서 일을 하시던, 버그바운티를 하시던 타 사용자에게 영향을 주는 행위 자체는 둘 다 굉장히 네거티브하기 때문에 캐시 포이즈닝에선 무조건 사용하는 것이 좋습니다. 저런 리스크를 떠나서 공격이 성공했는지 체크하기 위해서라도 Cache busting은 정말 좋은 방법입니다.

Conclusion

이외에도 cache busting을 사용할 수 있는 구간은 굉장히 많습니다 😁