csrf(cross site request forgery)는 악성 웹사이트 공격 유형중 하나로, 사용자가 의도치 않게 공격자가 의도한 행위(등록, 수정, 삭제 등등...)를 특정 웹사이트에 요청하게 하는 공격을 뜻합니다.
사용자가 방문한 웹사이트에서 사용자의 브라우저에 전송하는 작은 텍스트 조각을 의미합니다. 쿠키가 있으면 웹사이트에서 사용자에 관한 정보를 기억하여 다음번에 사이트에 방문할 때 번거로운 작업을 피하고 더욱 유용하게 사이트를 활용할 수 있습니다.
클라이언트와 서버 간의 연결 상태를 의미합니다. 더욱 구체적으로 말해서, 클라이언트가 브라우저에 접속하여 서버와의 접속을 종료하기 전(창을 닫기 전)까지의 상태를 의미합니다.
1. 사용자는 보안이 취약한 서버에 로그인합니다.
2. 로그인 이후 서버에 저장된 세션 정보를 사용할 수 있는 sessionID가 사용자 브라우저 쿠키에 저장됩니다.
3. 공격자는 서버에 인증된 브라우저의 사용자가 악성 스크립트 페이지를 누르도록 유도합니다.
4. 사용자가 악성 스크립트가 작성된 페이지에 접근 시, 쿠키에 저장된 sessionID는 브라우저에 의해 자동적으로 함께 서버로 요청됩니다.
5. 서버는 쿠키에 담긴 sessionID를 통해 해당 요청이 인증된 사용자로부터 온 것으로 판단하고 처리합니다.
위에서 csrf에 관해 알아보았으니, 드림핵의 csrf 문제를 한번 풀어보도록 하겠습니다. 사실 문제 정보만 보면 무슨 문제인지 모르겠는데, 풀다 보니 사용자로서 사이트에 로그인할 때 생성되는 쿠키값으로 관리자의 비밀번호를 변경하여 사이트에 관리자로서 로그인하는 문제라는 것을 알 수 있습니다....
일단 문제 파일을 다운로드 하고, 사이트에 들어가 봅니다!!
guest로서 로그인 해 봅시다😎
성공적으로 로그인 되었습니다😁 직접적으로 csrf공격을 수행하기 전에, 다운받은 파이썬 코드를 확인해 볼까요?
파이썬 코드를 통해, 사이트에 관한 정보를 알 수 있습니다.
여기서, vuln(csrf)페이지로 들어가 볼까요?
param에
<script>alert(1)</script>
구문이 들어간 것을 알 수 있고, 이 값이 그대로 화면에 출력된다는 것도 알 수 있습니다. 다만 아까 다운받은 파이썬 코드를 보면 frame, script, on 키워드에 대해 필터링을 하고 있어서, 별 기호(*
)로 치환된 것을 알 수 있습니다.
이를 통해, 스크립트가 vuln(csrf)화면을 통해 실행될 수 있다는 것을 알 수 있습니다.
flag에 접속해 봅시다.
이런 화면이 뜨는데요, 파이썬 코드를 확인해 보면 flag페이지의 param 값에 무언가를 입력하면 admin(관리자)에 대한 쿠키 값이 브라우저에 저장되고, vuln(csrf)페이지는 입력한 param값이 그대로 화면에 출력되는 페이지로, 제가 입력한 param값이 출력되거나 실행되게 됩니다.
flag 페이지를 통해 param값을 변경할 수 있고, 변경한 param값이 그대로 실행되기 때문에 위의 param 입력창에
<img src="/change_password?pw=abc123">
관리자의 패스워드를 abc123으로 바꾸는 코드를 작성해 봅시다.
그러면 관리자(admin)의 비밀번호가 성공적으로 abc123으로 변경되었습니다. 이것을 직접 확인해 볼까요?
이렇게 로그인 하는데 성공하면서, 플래그 값이 뜨게 됩니다. 이 값을 플래그 창에 입력해주시면 문제가 해결되었다고 뜹니다.😎😎
이 문제는 param값이 페이지에 그대로 실행되는 취약점을 이용하여, 사용자가 임의로 param값을 입력하고 admin에 대한 쿠키값을 획득하여 admin에 관한 정보를 변경할 권한을 가질 수 있음을 보여주고 있습니다.