Season 1/워게임

XSS Filtering Bypass

작성자 - 현우는 5살

XSS Filtering ByPass

  • 문제 설명
  • 문제 풀이
  • 문제 요약

- 3개의 페이지와 각 페이지의 기능

vuln(xss)page

단순하게 이미지를 출력하는 페이지로 보입니다. 

또한 GET방식을 사용하는것을 보아, param저 변수가 취약한 파라미터가 될 수 있을것이라고 생각됩니다.

 

memo

memo를 출력하는 페이지로 보입니다.

이것 또한GET방식을 사용하는것을 보아 시도해보는것도 좋을거 같습니다.

 

flag

입력한값에 제출하면 저 url대로 동작하는것이라고 생각합니다. POST 방식을 사용합니다.

 


app.py 코드의 주요 함수 확인

 

def check_xss(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)

check_xss 함수는 param를 url인코딩을 진행하고, vuln페이지에 보내는 url를 작성하여 쿠키와 함께, readurl에 전달하는 형식입니다.

def xss_filter(text): _filter = ["script", "on", "javascript:"] for f in _filter: if f in text.lower(): text = text.replace(f, "") return text

xss_filter는 "script", "on","javascript"를 필터링하고 또한, lower()함수를 사용하여 소문자까지 필터링하는것을 확인할 수 있습니다.

def vuln(): param = request.args.get("param", "") param = xss_filter(param) return param

xss_filter함수를 호출 후에 그 결과값을 반환하는 함수 입니다.

def flag(): if request.method == "GET": return render_template("flag.html") elif request.method == "POST": param = request.form.get("param") if not check_xss(param, {"name": "flag", "value": FLAG.strip()}): return '<script>alert("wrong??");history.go(-1);</script>' return '<script>alert("good");history.go(-1);</script>'

flag함수는 GET방식은 flag.html을 랜더링하여 반환하지만 POST 형식으로 진행할경우 check_xss함수의 반환값으로 동작하는것을 확인할 수 있습니다.

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

받아온 값을 memo_text에 저장하고 랜더링 후에 반환하는 것을 보입니다.


- 의심되는거 시도

vuln페이지의 시도해봤는데 xss_filter에 의해서 필터링되는것을 확인할 수 있습니다.

 

필터링 우회

<sscriptcript>alert(1)</sscriptcript>

script를 우회하여 진행하였다.

성공적으로 동작하는것을 확인할 수 있습니다.

이걸 이용해서 flag값을 얻어와야합니다.

이 문제는 플래그를 읽기 위해서는 가상의 관리자의 쿠키를 받아서 값을 출력해야합니다.

워게임 문제에서 값을 출력하는 페이지는 memo이기 때문에, memo 페이지를 이용해볼려 합니다.

memo파라미터에 123을 입력하면 123이 출력됩니다.

페이로드를 작성해서 이 페이지에서 바로 출력할려고 시도 하였으나,

잘 동작하지 않습니다.

아마 다른 페이지에서 진행해야할거 같습니다.

위에 flag함수에서 GET방식으로 통신을 진행할 경우, POST 방식으로 동작해야 코드가 정상적으로 동작함을 알 수 있습니다.

페이지 중 POST 방식으로 동작하는 페이지는 flag 페이지이기 때문에

flag페이지에서 페이로드를 전달합니다. 

페이로드

<sscriptcript>locatioonn.href="/memo?memo="+document.cookie;</sscriptcript>

flag함수는 정상적으로 동작하는것을 확인할 수 있다.

정상적으로flag가 나오는것을 확인할 수 있습니다.


이 글이 도움이 되었다면, 응원의 댓글 부탁드립니다.