워게임/dreamhack

XSS Filtering Bypass

  • -

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가 나오는것을 확인할 수 있습니다.


문제 요약

'워게임 > dreamhack' 카테고리의 다른 글

[DreamHack] Flying Chars  (0) 2024.07.31
[pwnable] shell_basic 문제풀이  (0) 2024.05.26
[dreamhack] ROT128 문제풀이  (0) 2024.01.31
[dreamhack] rev-basic-8 문제풀이  (0) 2023.12.26
[dreamhack] dreamhack-tools-cyberchef 문제풀이  (0) 2022.05.31
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.