dreamhack

[Dreamhack] CSRF-1 / 2

부산영롱 2024. 1. 1. 22:28

xss 문제에서는 임의의 사용자가 내가 원하는 페이지에 쿠키를 넣어서 보내게 했다면

csrf 문제에서는 임의의 사용자가 로그인한 상태로 내가 원하는 페이지에 특정 요청을 하게 만들면 된다.

 

CSRF-1

4개의 페이지가 있고 /vuln 페이지는 xss 문제와 다르게 'iframe, script, on' 문자열 필터를 걸어 못 쓰게 만들었다.

 

xss-2 에서 script가 막혀서 우회했던 3가지 방법 중 iframe과 svg/onload는 막혔지만 img 태그는 필터링 되지 않았으니 이걸 이용해보자

 

CSRF 문제는 다른 사용자의 쿠키를 탈취하는 것이 목적이 아닌 다른 사용자가 특정 페이지를 요청하도록 만들어야한다.

여기서 특정 페이지는 /admin/notice_flag 이다.

@app.route("/admin/notice_flag")
def admin_notice_flag():
    global memo_text
    if request.remote_addr != "127.0.0.1":
        return "Access Denied"
    if request.args.get("userid", "") != "admin":
        return "Access Denied 2"
    memo_text += f"[Notice] flag is {FLAG}\n"
    return "Ok"

코드를 보면 IP 주소는 반드시 "127.0.0.1" 이어야 하고 userid는 "admin" 이어야한다.

 

<img src="/admin/notice_flag?userid=admin"> 를 입력하면 /memo에서 flag를 확인할 수 있다.

 

 

CSRF-2

이번에는 /admin/notice_flag 페이지가 없어지고 login 페이지가 생겼다.

@app.route("/change_password")
def change_password():
    pw = request.args.get("pw", "")
    session_id = request.cookies.get('sessionid', None)
    try:
        username = session_storage[session_id]
    except KeyError:
        return render_template('index.html', text='please login')

    users[username] = pw
    return 'Done'

코드를 보면 /change_password라는 숨겨진 페이지가 있다.
GET 요청하면 해당 URL에서 pw 라는 파라미터의 값을 가져와 사용자의 패스워드로 변경시키도록 되어있다.

/flag 페이지를 통해 '/change_password?pw=1234' 와 같은 URL을 요청하게 하면 admin 계정의 비밀번호를 쉽게 얻어낼 수 있다.

'dreamhack' 카테고리의 다른 글

[Dreamhack] Mango  (0) 2024.01.10
[Dreamhack] simple_sqli  (1) 2024.01.09
[Dreamhack] xss-2  (0) 2023.12.31
[Dreamhack] xss-1  (0) 2023.12.31
[Dreamhack] phpreg  (0) 2023.12.29