본문 바로가기
정보보안

버프스위트 CSRF 취약점 탐색,대응 기록

by puy0 2026. 3. 17.

이번 취약점은 서버측에서 요청의 Origin과 Referer을 체크하지않고 로그인 상태에만 의존해

바로 승인해 버리는 CSRF관련 문제다

정상적인 유저플로우에선 문제가 없지만 사용자가 악성 사이트에 접속 했을때 문제가 된다

 

해당 문제를 한문장으로 설명하면

"특정사이트에 들어가기만 했는데 내 계정으로 뭔가 써지거나 악용되는 것”

 

 

다음과 같이 가정해 보겠다

더보기

1. 일반 사용자가 SML서비스에서 정상적인 로그인상태다

2. 해당 사용자가 SML의 피싱 링크에 접속한다

3. 해당 피싱링크는 SML의 API /submitYoutubeLink 엔드포인트로
광고 링크와 피싱사이트를 업로드 하는 내용의 사이트다

4. 사용자의 브라우저는 해당 요청에 사용자의 로그인정보를 끌어다 붙힌다(SML이라는 목적지가 같기 때문)

 

결국 사용자의도가 아닌 피싱사이트에 의해 광고,피싱사이트가 업로드 된다

이때 SML에 로그인 했고 SML에서 링크를 클릭했고 SML에 업로드하는 동작들에 의해

로그인한 사용자들은 모두 해당 공격대상에 적용될수 있다

피싱페이지가 정보를 끌어오지도 않고 사용자에게 수락 버튼을 요구하지도 않는다

사용자가 어디서 잘못되었는지 모르면 알 수도 없다

 


취약점이 발견된 api의 기능

더보기

이번 취약점은 POST /submitYoutubeLink 에서 발견했다
해당 기능은 로그인 한 유저가 본인이 원하는 유튜브 링크를 올리면
해당 유저가 생성한 플레이리스트에 저장된다
그렇게 원하는 유튜브 재생목록을 타인에게 공유 할 수 있는 SML의 핵심 기능이다

 


 

 

해당 문제의 검증

 

/ submitYoutubeLink 요청의 Origin, Referer을 삭제 혹은 임의로 변경후 정상응답을 확인한다
해당 속성을 검사하지않음을 확인할 수 있으면 바로 취약점과 직결된다

 

추가적으로 앞의 접은글(가정) 대로 공격 시나리오를 따라 간단한 페이지를 만들어 보겠다

단순하게 해당폼이 바디에들어간 짧은 파일을 만들었다

<form id="csrfTestForm" action="http://192.168.111.1:8080/submitYoutubeLink" method="POST">
    <input type="hidden" name="youtubeLink" value="https://youtu.be/TgeiukPo_Kc?si=oU2ljasdDqb5lNwh">


실제로 악용하기 위해선 변수를 바인딩받아 요청하도록 하면 되겠다

이 페이지를 임의의 계정을 통해 SML에 등록해야 하지만

내 서비스는 사용자가 링크를 직접 올릴 수 없도록 막아놨기 때문에
외부적요인으로 접속 했다고 하겠다

여기서는 파일위치가 보이지만 실제상황에서는 출처모를 페이지가 잠깐 생겼다 사라질것이다

 

사용자의 의도가 아닌 글이 생성됨

이렇게 취약점을 응용해 CSRF공격을 검증해볼 수 있었다

 




CSRF의 대응

해당 서비스는 Spring 프레임워크 기반이기때문에 Spring Security를 끌어쓰는것이 적절할것이다

하지만 이 서비스의 세션,인증,인가방식은 직접 구현되어 전반에 사용되어있기 때문에
당장 Spring Security를 접목하는것에 어려움이 있다
서버코드의 디랙토리화가 잘 되어있다고 생각하기 때문에
지금당장 CSRF token과 same site체크 기능을 구현해 붙히고

추후에 Spring Security를 가용하는것이 적절한 대응방법이겠다

 

 

 

대응에 대한 커밋 기록을 볼 수 있습니다

https://github.com/geonho1943/shareMyList/commit/33dc4426a7a3d22a083980d49fed1757b8e64e8e

 

Feat: 상태변경 기능의 취약점에 대응(CSRF token 적용) · geonho1943/shareMyList@33dc442

+ 예외처리에 대한 폼을 적용했습니다

github.com

 

댓글