태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.


CSRF(Cross Site Request Forgery) 취약점은 번역이 조금 애매하다. "사이트 간 요청 위조" 정도로 번역한다. 


이 취약점은 GET 또는 POST 요청을 서버가 받았을 때 요청이 변조된 것이 아닌지를 검사하는 여러 코드가 서버 사이드에서 검증되지 않은 채 실행할 때 발생한다.


DVWA에서는 비밀번호 변경 페이지를 예로 들어 실습을 할 수 있도록 해준다.



위의 비밀번호 페이지를 가만히 들여다 보면 몇가지를 유추할 수 있다.


먼저 현재의 비밀번호를 물어보지 않고 변경할 새 비밀번호만 물어본다. 이게 뭐가 문제냐? 라는 생각이 든다면 모의해킹 전문가는 아직...꿈꾸지 말길 바란다. 보다 다양한 개발 경험을 쌓고 다시 도전해보길 권하고 싶다.


현재의 비밀번호를 묻지 않는다는 이야기는 이용자 혹은 사용자가 로그인한 창을 열어놓고 잠시 자리를 비운사이 누군가 그 자리에서 불법적으로 비밀번호를 변경할 수 있다는 이야기다. 이런 취약점이 바로 CSRF 공격에 노출될 가능성이 있다.



즉 원격에 위치한 해커가 비밀번호를 변경하는 요청(GET 혹은 POST)을 로그인한 사용자에게 여러 형태로 전송해 실행하도록 유도할 수 있다면 해커가 원하는 비밀번호로 임의 변경을 할 수 있다는 이야기다.


그렇다면 해커는 이 사이트에 접속해 비밀번호를 요청할 때 어떤 요청이 웹서버로 전송되는지 확인하려 할 것이다.


웹페이지 소스를 열어봐도 되고 버프스위트를 이용해 요청을 분석해도 된다.


먼저 웹페이지 소스를 보면 다음과 같다.



GET 방식의 요청이며 파라미터는 password_new와 password_conf 그리고 Change 세개가 넘어간다. 실제로 버프스위트에서 요청을 가로채 보면 다음과 같다.



예상대로 세개의 파라미터가 넘어간다. 그리고 가장 하단에 PHPSESSID가 함께 넘어간다. 이미 로그인한 사용자의 저 PHPSESSID를 알아내면 좋겠지만 그건 사실 쉽지 않다. 사용자의 PC에 악성코드를 심어 PC를 장악하거나 스니핑 등을통해 가로채지 않으면 말이다.


비밀번호가 변경되면 다음과 같이 Password Changed. 라는 메시지가 보인다.



그렇다면 이미 이 사이트에 로그인해 있는 사용자에게 어떻게 조작된 GET 요청을 실행하도록 유도할 것인가를 고민해야 한다. 가장 손쉬운 방법은 바로 비밀번호를 변경하는 GET 요청을 할 수 있는 링크를 포함하는 메일을 보내 클릭을 유도하는 것이다.


그럼 메일을 작성해보자. 다음 메일에서 작성해보았다.



"여기"라는 링크를 클릭하도록 해야 한다. 그리고 메일 사이트에서는 대부분 HTML 편집기능을 제공한다. 그리고 쉽게 GET 요청이 담긴 앵커태그(<a>)를 삽입할 수 있다.


다음과 같이 말이다.



HTML 편집기능을 이용해 password_new에 123456, password_conf에도 123456 을 넣은 <a>태그를 "여기"라는 문자열에 심었다.


이 메일을 전송한다.


그럼 수신자의 메일에는 다음과 같은 메일이 도착한다. 네이버 메일에서 확인한 결과다.




만약 이 사용자가 dvwa에 이미 로그인한 상태로 로그아웃하지 않았다고 가정하고 위 화면의 "여기"라는 링크를 클릭하면..... 사용자는 본인이 의도하지 않은 비밀번호 변경 요청(GET)을 dvwa에 하게 된다.


이 여기라는 링크에 마우스를 올려보면 다음과 같은 GET 요청이 포함되어 있다는 것을 알 수 있다.



여기서는 이메일을 보내는 매우 구태의연한 방식을 취했지만 HTML 편집이 가능한 다른 웹페이지의 게시판에 이 GET 요청을 심어놓고 클릭하기를 기다릴 수도 있고, 별도로 작성된 응용프로그램을 첨부한 뒤 다운로드 받아 실행하면 이 요청을 전송하도록 하는 등 다양한 아이디어를 활용할 수도 있다. (특정 사이트를 공격하기로 작정한 해커의 창의력 지수는 갑작스레 치솟는다는 점을 명심하자.)


어쨌든 이 링크를 클릭하면 다음과 같이 갑자기...비밀번호가 변경되었다는 창이 뜬다.


이 문제를 해결하는 방법은 매우 단순하다.


 o 이전 비밀번호를 함께 입력받아 실제 요청을 하는 사용자가 계정의 주인이 맞는지를 확인


실제로 많은 웹사이트들이 비밀번호 뿐만 아니라 단순한 개인정보를 변경할 때도 한번 더 비밀번호를 입력할 것을 요구한다. 그 이유는 매우 다양한 취약점... 지금까지 발견되지 않은 취약점도 포함....들로 인해 개인정보가 위/변조되어 아이디와 비밀번호가 탈취 될 수 있기 때문이다.


실제로 이메일주소나 전화번호가 변조되면 비밀번호 찾기 또는 비밀번호 초기화 등을 통해 비밀번호를 임의로 변경할 수 있다.그렇기 때문에 많은 웹사이트들이 개인정보 수정 화면에서 이미 로그인을 했음에도 불구하고 다시 한번 더 비밀번호를 입력받아 현재 ID의 주인이 맞는지를 확인하는 것이다.