본문 바로가기

Dreamhack

[Dreamhack 문제 풀이] _ CSRF 1

문제를 풀기 전에 먼저, CSRF에 대해 알고 넘어갈 필요가 있다.

 

 CSRF는 웹사이트 취약점 공격방법 중 하나로, 사용자가 사진의 의지와는 상관없이 공격자가 의도한 수정, 삭제, 등록

 행위 등 특정 웹 사이트에 요청하게 하는 공격을 말한다. 

 

 

해당 문제를 풀기 위해서 이전에도 그랬던 것과 같이, 서버 생성하기 버튼을 클릭하여 서버를 생성하여 주고 문제 파일을 다운로드한다.

 

생성된 서버 url를 클릭해 보면 해당 화면이 나타난다. 

 

첫 번째 항목인 vuln(csrf) page을 클릭하였을 때,

해당 화면이 나타난다는 것을 알 수 있었다.

 

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

 

 

다음으로 2번째 항목인 memo를 클릭했더니 해당 화면이 나타났다.

 

memo 화면을 통해서는, memo page에 접속하면 memo 파라미터로 hello를 전달하고, 응답 화면에서는 hello를 출력한다는 사실을 알 수 있었다. 

 

다음으로는 3번째 항목인 notice flag에 접속해 보았다. 

해당 화면에서는 Access Denied (접근 불가)라는 문구가 출력된다는 사실을 알 수 있었다.

 

마지막으로는 네 번째 항목인 flag에 접속해 보았다. 

 

flag page 에는 제출하기 버튼이 있음을 알 수 있었다.

빈칸에 들어갈 값이 무엇일까 하고 고민하던 중, 우리가 이전에 보았던 csrf 페이지와 경로가 유사한 것으로 짐작이 되어서 csrf page에서 확인했던 alert(1)를 출력하는 구문을 빈칸에 넣어보았다. 

 

 

csrf page에서 확인했던 alert(1)를 출력하는 구문 : <script> alert(1)</script>

해당 값을 넣고, 제출 버튼을 클릭하였더니

 

해당 화면이 나타난다는 사실을 알 수 있었다.

그러나 문제에서 요구하고자 하는 값이 아닐 수 있다고 생각하여, 우리가 문제 파일에 다운로드하였던 코드를 살펴보았다.

 

 

문제 파일의 코드를 살펴보니, @app.route가 총 5개 존재한다는 것을 파악할 수 있습니다. 

@app. route("/", "/vuln", "/flag", "/memo", "/admin/notice_flag") 총 5개라는 사실을 알 수 있습니다. 

 

문제에서는 특정 사용자(admin)가 특정 페이지(/vuln)에 방문하는 경우 flag 값을 출력하는 페이지 (/admin/notice_flag

)로 요청을 보내도록 하는 스크립트 작성을 요구한다는 것을 알게 되었습니다.

 

user id = admin 인 경우에, flag 값을 출력하도록 하도록 하기 위해서는

local host에서 /admin/notice_flag? userid=admin으로 접근해야 합니다.

 

따라서 /flag page에 <img src=" /admin/notice_flag? userid=admin" />와 같은 스크립트를 입력해 주면 우리가 얻고자 

하는 flag 값을 얻을 수 있습니다. 

 

DH {} 뒤에 제시되는 flag를 얻을 수 있습니다. 

 

해당 flag를 입력하여 복사하면

문제풀이 완 - 료!