Yozzang의 해킹일기 💻
article thumbnail
728x90

오늘은 DreamHacker의 웹 해킹 워게임 중 하나인 csrf-2를 함께 풀어볼 예정입니다.

 

 

csrf-2

여러 기능과 입력받은 URL을 확인하는 봇이 구현된 서비스입니다. CSRF 취약점을 이용해 플래그를 획득하세요. Reference Client-side Basic

dreamhack.io

 

 

 

문제 정보를 살펴보면 해당 워게임은 Cross-Site Request Forgery취약점을 이용하면 된다고 합니다.

 

워게임 사이트에 접속해 보면 아래와 같은 페이지가 로딩될 겁니다.

index

 

메인 화면에 vuln(csrf) page, flag, login 이렇게 총 3개의 링크가 있는데 하나 씩 클릭해서 확인해보면 각각 다음과 같습니다.

vuln(csrf)
vuln(csrf)
flag
login

 

먼저 vuln 페이지는 아직 뭐가 뭔지 감이 안 잡힌 것 같습니다. flag 페이지는 우리가 조작할 수 있는 뭔가가 있을 것 같고 login 페이지는 그냥 평상시에 우리가 접했던 login 페이지와 같습니다. 

 

그럼 이제 문제 파일을 다운로드해서 문제 파일의 주요 부분들을 함께 살펴보겠습니다.

먼저 파일의 10번째 줄부터 13번째 줄을 통해서 FLAG라는 변수가 flag.txt파일에 저장되어 있는 내용임을 알 수 있습니다.

그리고 15번째 줄부터 18번째 줄에 나와 있는 users를 통해서 사용자가 총 2명이 있고, 각각의 아이디와 비밀번호에 관한 정보를 알 수 있습니다.

또한 20번째 줄을 통해 session_storage라는 딕셔너리 변수가 있다는 것도 확인할 수 있습니다.

54 ~ 62

"/"에 관한 코드를 살펴보겠습니다. ("/"는 보통 메인페이지, 즉 index.html을 의미합니다)

index()에 관한 함수가 있습니다. 이 함수의 초반 부분을 살펴보면 session_id를 불러와서 사용자가 로그인했는지를 검증하는 것 같습니다. 로그인하지 않는 상태이면 'please login'이라는 text를 index.html에 출력합니다(60번째 줄).

그리고 62번째 줄의 return 값을 살펴보면 "Hello username, flag is FLAG(이전 11번째 줄에 나왔던 FLAG변수)" if username == "admin"이라는 구문이 있습니다. 즉, 우리가 admin으로 로그인하면 FLAG를 출력해서 보여주겠다는 겁니다. 만약 admin 말고 다른 계정으로 로그인 하면 Hello {username}, you are not an admin이라는 구문이 출력될 겁니다. 

 

그럼 현재 우리가 가지고 있는 정보를 활용해서 csrf-2의 로그인 기능을 시도해보겠습니다.

guest 로그인 시도

guest-guest로 로그인을 시도해보니 성공적으로 로그인이 된 것 같습니다. 하지만 메인 페이지를 살펴보면 역시 우리가 admin이 아니라는 문구가 나와 있네요. 그럼 이어서 문제 파일을 분석해 보겠습니다.

74~85번째 줄은 flag 페이지에 관한 소스코드입니다. 85번째 줄의 return 값을 통해 xss 공격이 가능하다는 사실을 알 수 있습니다.

그러나 여기서 가장 중요한 것이 바로 81번째 소스 코드입니다. 우리가 flag 페이지에 접속하는 즉시 session_storage[session_id]의 값이 'admin'으로 설정되어 있을 것이라는 의미입니다.

 

이어서 보겠습니다.

108 ~ 118

108~118번째 줄을 살펴보면 change_password라는 html이 또 존재한다는 것을 알 수 있습니다. 이 소스코드의 전반적인 내용이 index.html과 비슷하니까 다른 부분인 117번째 줄을 보겠습니다.

users[username] = pw이라고 나와있네요. 여기서의 username은 113번째 줄에 나와있는 session_storage[session_id]의 값입니다.

그말이 즉 우리가 flag 페이지에 접속하는 즉시, users[username] = pw = "admin"이라는 것입니다.

그래서 우리는 원하는 pw에 원하는 패스워드를 넣어서 변경할 수 있습니다.

 

이어서 보겠습니다.

65 ~ 71

vuln페이지에 관한 정보가 담겨있는 소스코드입니다. 여기서 우리가 주의 깊게 봐야할 부분은 바로 68번째 줄인데요. xss_filter이라는 변수에 "frame", "script", "on"이 들어가 있습니다.

 

XSS(Cross Site Scripting)에 대해서 간단히 설명하자면 XXS는 웹 브라우저에서 사용자가 입력할 수 있는 input태그 등에 악의적인 script를 작성하여 해당 contents를 이용하는 다른 이용자의 개인정보 및 쿠키정보 탈취, 악성코드 감염, 웹 페이지 변조등을 할 수 있는 해킹기법입니다.

 

그러나 해당 코드의 68~71번째 줄을 살펴보면 "frame", "script", "on" 이렇게 3개의 태그는 "*"로 대체됩니다. 즉, 이 3가지 태그는 스크립트로 인식이 안된다는 겁니다.

 

문제 파일을 대충 살펴봤으니 이제 우리는 공격을 시도할 것입니다. 앞서 언급한 frame, script, on 태그는 사용할 수 없으니 필자는 "img"태그를 사용해서 공격을 시도해보도록 하겠습니다.

 

우리는 admin 계정으로 로그인해야 하기 때문에 admin의 비밀번호를 1234로 변경해보도록 하겠습니다.

 

flag 페이지에 들어가서 다음 공격 코드를 입력하고 제출하겠습니다.

 

<img src="/change_password?pw=1234">

 

다시 로그인을 시도해보면

 

flag가 성공적으로 출력되는 것을 확인하실 수 있습니다.

profile

Yozzang의 해킹일기 💻

@요짱

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!