접근할 수 있는 경로는 '/', '/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을 방문하는 코드이므로 생략한다.
따라서, 생각할 수 있는 공격코드는 다음과 같다.
- admin이 /admin/notice_flag를 방문하게 해야한다.
- check_csrf 함수는 admin이 /vuln을 방문하게 해준다. (/admin/notice_flag)를 방문하게 해야한다.
- 다시 공격자로 돌아와서 /memo를 확인하면, flag가 있을 것이다.
/vuln에서는 XSS 뿐만 아니라 다른 html 태그도 삽입이 가능하다.
<img src=" "> 를 사용해보자.
/flag에 들어가면 param을 입력할 수 있다.
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 |