[Web Hacking] DH CSRF-1

KyungH·2024년 3월 2일

Web Hacking War Game

목록 보기
6/17
post-thumbnail

📝Problem - CSRF-1

CSRF 취약점을 이용하여 FLAG를 획득하는 문제.
전체적인 구성을 보면 XSS-1 문제와 비슷한 것을 볼 수 있다.

@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

/vuln 페이지에서 param 으로 사용자의 입력 값을 그대로 출력하나, 이 과정에서 frame, script, on 세 가지의 키워드를 필터링하고 있다. 그러나 꺽쇠를 포함한 다른 키워드와 태그는 사용할 수 있으므로 CSRF 공격을 수행할 수 있다.

@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"

/admin/notice_flag 페이지를 보면, 페이지에 접근하는 이용자가 로컬호스트이어야 하며, userid 파라미터의 값이 'admin' 인지를 확인한 후, FLAG를 출력한다.


📌Approach

/admin/notice_flag 페이지에 로컬호스트로 접근해야 하므로
공격 코드가 삽입된 /vuln 페이지를 로컬호스트 이용자가 방문할 경우, 의도하지 않은 페이지, 즉 /admin/notice_flag 페이지로 요청을 전송하는 시나리오가 필요하다.

/flag 페이지를 통해 로컬 호스트 환경의 이용자가 임의 페이지를 방문하게 한다.


📌Solution

<img> 태그를 활용하여 작성하며, userid 파라미터가 admin 인지 검사하는 부분을 위해 해당 부분의 문자열을 추가하여 다음과 같이 /flag 페이지에서 작성한다.

<img src="/admin/notice_flag?userid=admin" />

위 과정을 통해 일반 유저가 아닌 로컬호스트의 이용자만 실행할 수 있는 기능을 해당 이용자의 의도와는 무관하게 실행하도록 하였다.


References

DreamHack 강의 - Exercise: CSRF

0개의 댓글