Without a Break

[Dreamhack] csrf-2 본문

Web/Wargame

[Dreamhack] csrf-2

와븨 2022. 9. 24. 16:48

 

[문제 파일]

vuln()

@app.route("/vuln")
def vuln():
    param = request.args.get("param", "").lower()
    xss_filter = ["frame", "script", "on"]
    for _ in xss_filter:
        param = param.replace(_, "*")
    return param
  • 이용자에게 요청(입력)받은 param의 값을 소문자로 변경한다.
  • xss_filter에 저장된 문자열은 필터링하여 *로 치환한다.

flag()

@app.route("/flag", methods=["GET", "POST"])
def flag():
    if request.method == "GET":
        return render_template("flag.html")
    elif request.method == "POST":
        param = request.form.get("param", "")
        session_id = os.urandom(16).hex()
        session_storage[session_id] = 'admin'
        if not check_csrf(param, {"name":"sessionid", "value": session_id}):
            return '<script>alert("wrong??");history.go(-1);</script>'

        return '<script>alert("good");history.go(-1);</script>'
  • GET method를 요청받은 경우, flag.html 페이지를 보여준다.
  • POST method를 요청받은 경우, 16진수로 16비트의 랜덤 세션 아이디를 생성하고 admin에 대한 세션을 생성한다.

change_password()

@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'
  • pw 변수에 get 방식으로 패스워드의 파라미터 값과 세션 아이디를 가져온다.
  • session_id 변수에 요청받은 쿠키의 sessionid 값을 저장한다.
  • session_id가 session_storage에 없을 경우 'please login'을 출력한다.
  • user의 비밀번호를 변경할 수 있음

 


 

[풀이]

 

vuln 페이지에서는 script가 필터링 되어 팝업창이 뜨지 않고 다음과 같이 뜬다.

 

 

users = {
    'guest': 'guest',
    'admin': FLAG
}

문제 코드의 이 부분을 보면 guest와 admin의 2개의 계정이 있음을 알 수 있다.

현재 비밀번호를 아는 계정은 guest밖에 없으므로 guest로 로그인을 해 준다.

 

 

로그인을 하면 당신은 admin이 아니라는 문구가 뜬다.

이제 flag 페이지에서 admin이 되도록 조작할 것이다.

 

vuln 페이지에서 알 수 있듯이 script 태그는 사용할 수 없으므로 csrf 취약점임을 이용해 img 태그를 사용한다.

chage_password()에서 admin의 비밀번호를 조작할 수 있었으므로

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

위의 코드를 flag 페이지에 입력하고 제출한다.

 

그 다음, 바꾼 비밀번호를 통해 admin 계정으로 로그인 하면

플래그가 출력되는 것을 알 수 있다.

 

 

답 : DH{c57d0dc12bb9ff023faf9a0e2b49e470a77271ef}

'Web > Wargame' 카테고리의 다른 글

[Dreamhack] simple_sqli  (0) 2022.09.24
[Dreamhack] SQL Injection  (0) 2022.09.24
[Dreamhack] csrf-1  (0) 2022.09.24
[Dreamhack] ClientSide: CSRF  (0) 2022.09.21
[Dreamhack] xss-2  (0) 2022.09.21