본문 바로가기

Dreamhack

[Dreamhack 문제 풀이] _ CSRF 2

 

CSRF 1과 마찬가지로 문제를 풀기 위해서는, 서버 생성하기 버튼을 클릭하고 문제 파일을 다운로드합니다.

생성된 서버에 들어가 보면 해당 화면이 나타난다는 사실을 알 수 있습니다.

CSRF 1 문제를 풀었을 때와 마찬가지로, 제시되어 있는 각각의 항목들을 클릭해 보도록 하겠습니다.

 

첫 번째로, vuln(csrf) page의 페이지에 접속하면 해당 화면이 나타난다는 사실을 알 수 있습니다. 

CSRF 1에서 알 수 있던 것처럼, 화면을 통해서 1) csrf 페이지에 접속하면 csrf 파라미터(parameter)로 alert(1)를 실행하는 스크립트 구문을 전달하는 것과, 2) 응답 화면에서는 script 구문이 필터링된 것을 볼 수 있었습니다. 

 

두 번째로는 flag 페이지에 접속해 보았습니다. 

/flag 페이지는 플래그를 얻기 위한 코드를 삽입하는 곳으로,

csrf 취약점을 발생시킬 수 있는 코드를 찾아 넣으면 된다는 사실을 파악할 수 있었습니다. 

 

 

마지막으로는 login 페이지에 접속해 보았는데,

해당 화면이 나타난다는 사실을 파악할 수 있었습니다.

 

CSRF 2의 서버에서는 CSRF 1에서 존재하지 않았던 항목들도 생겨남을 볼 수 있었습니다.

Login 창에서, 계정을 통한 로그인을 하기 위하여 다운로드한 코드를 살펴보았습니다.

 

해당 코드에서 분석해 본 부분은 첫 번째로 엔드포인트 (@app.route)의 개수입니다.

 

 

사진을 통해 알 수 있듯이, 엔트포인트 (@app.route)는 총 “/”, “/vuln”,”/flag”,”/login”,”/change_password” 5개임을 알 수

있었습니다. 

 

그렇다면 두 번째로는, 각각의 다른 엔드포인트들이 어떤 기능을 하고 있는지 살펴보았습니다. 

 

마지막으로 세 번째는, guest와 admin 계정 2개가 존재한다는 코드를 살펴보았습니다. 

 

해당 코드를 살펴본 이유는, Login 창에서 계정을 통해 로그인을 할 때 필요한 부분이었기 때문입니다.

 

 

먼저, username과 password에 모두 guest를 입력하여 로그인을 시도해 보았습니다. 

로그인을 시도하였더니, 해당 화면이 나타난다는 것을 알 수 있었습니다.

곧 admin(관리자)의 권한으로 로그인을 해야 우리가 얻고자 하는 flag를 얻을 수 있다는 것을 확인할 수 있었습니다.

 

그렇다면 guest가 아닌, admin(관리자)의 권한으로 로그인을 해야 하는데, 로그인을 하지 못하는 이유를 찾아보았습니다. 

그 이유는 코드를 통해서도 알 수 있듯이, 계정의 비밀번호를 알지 못하기 때문입니다.

 

admin 계정으로 로그인을 하기 위한, 단서는 바로 change_password 엔드 포인트임을 코드를 살펴보며 알 수 있었습니다.

change_password를 통해 알 수 없는 비밀번호를 임의로 변경해서 로그인할 수 있기 때문입니다.

 

그렇기에 해당 내용을 이용하여,

 

 

 

 /change_password? 파라미터(pw)를 입력하여 원하는 임의의 값으로 비밀번호를 url에 요청하여 변경하였습니다. 

성공적으로 변경되었다는 화면이 나타났습니다. 

 

하지만 이것은 guest의 password를 바꾼 것이기에, 우리가 원하는 admin의 password를 바꾸기 위해서는 flag 페이지를  이용해야 합니다.

 

해당 /flag를 통해 해당 페이지에서 post 메서드 요청 시 admin 세션으로 요청한다는 것을 확인할 수 있습니다. 그렇다면 해당 page에서 파라미터를 입력할 경우, admin 세션으로 요청하기 때문에 조건에 맞는 flag를 입력할 경우, 패스워드를 변경할 수 있는 것입니다. 

 

csrt-1에서 사용했던 <img src=" /admin/notice_flag? userid=admin" /> flag에서

csrt-2에서는 조건에 맞게,  <img src= "/change_password? pw=1234" /> flag로 수정하였습니다. 

 

 

수정한 이후에 admin으로 로그인을 시도하였더니, 

 

 

로그인에 성공하였고, flag 값이 출력되었음을 알 수 있었습니다. 

 

flag 값을 복사하여 입력하면

문제풀이 완 - 료! 

'Dreamhack' 카테고리의 다른 글

[Dreamhack 문제 풀이] _ Mango  (0) 2023.11.10
[Dreamhack 문제 풀이] _ simple_sqli  (0) 2023.11.10
[Dreamhack 문제 풀이] _ CSRF 1  (0) 2023.11.07
[Dreamhack 문제 풀이] _ xss-2  (0) 2023.09.24
[Draemhack 문제 풀이] _ xss-1  (0) 2023.09.23