본문 바로가기

Dream hack/LEVEL 1

Dreamhack (csrf-1)

접근할 수 있는 경로는 '/', '/vuln', '/flag', '/memo', '/admin/notice_flag' 가 있다.

 

/ 는 그냥 기본적인 시작 페이지이다.

 

/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 값을 바로 return 한다. => XSS가 발생한다.

 

/memo 페이지는 memo argument를 받고, 그 값을 출력한다.

 

@app.route("/memo")
def memo():
    global memo_text
    text = request.args.get("memo", None)
    if text:
        memo_text += text
    return render_template("memo.html", memo=memo_text)

 

/admin/notice_flag 는 admin의 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"

 

주소가 localhost (127.0.0.1) 이며, userid가 "admin" 이면 memo에 flag를 출력해준다.

 

마지막으로, /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", "")
        if not check_csrf(param):
            return '<script>alert("wrong??");history.go(-1);</script>'

        return '<script>alert("good");history.go(-1);</script>'

 

check_csrf 함수가 등장한다.

 

def check_csrf(param, cookie={"name": "name", "value": "value"}):
    url = f"http://127.0.0.1:8000/vuln?param={urllib.parse.quote(param)}"
    return read_url(url, cookie)

 

read_url은 admin이 url을 방문하는 코드이므로 생략한다.

 

따라서, 생각할 수 있는 공격코드는 다음과 같다.

  1. admin이 /admin/notice_flag를 방문하게 해야한다.
  2. check_csrf 함수는 admin이 /vuln을 방문하게 해준다. (/admin/notice_flag)를 방문하게 해야한다.
  3. 다시 공격자로 돌아와서 /memo를 확인하면, flag가 있을 것이다.

 

/vuln에서는 XSS 뿐만 아니라 다른 html 태그도 삽입이 가능하다.

<img src=" "> 를 사용해보자.

 

/flag에 들어가면 param을 입력할 수 있다.

 

admin이 vuln 페이지를 방문하게 해준다.

 

param에 <img src="/admin/notice_flag?userid=admin"> 을 입력해보자!

admin이 경로를 방문하여 flag를 memo에 입력한 것을 확인할 수 있다.

 

'Dream hack > LEVEL 1' 카테고리의 다른 글

Dreamhack (command-injection-1)  (0) 2023.03.24
Dreamhack (xss-2)  (0) 2023.03.24
Dreamhack (devtools-sources)  (0) 2023.03.22
Dreamhack (file-download-1)  (0) 2023.03.22
Dreamhack (simple_sqli)  (0) 2023.03.22