728x90
반응형
해당 문제에서는 총 4개의 페이지가 제공된다.
1
2
3
4
|
@app.route("/vuln")
def vuln():
param = request.args.get("param", "") # 이용자가 입력한 vuln 인자를 가져옴
return param # 이용자의 입력값을 화면 상에 표시
|
cs |
/vuln 페이지이다.
XSS 취약점이 있는 페이지이다.
param 이라는 변수에 값을 입력받게 되며, 문자열 필터링을 하지 않는다.
따라서 해당 페이지에 스크립트문을 입력하면 필터링이 없으므로 동작하게 된다.
1
2
3
4
5
6
|
@app.route('/memo') # memo 페이지 라우팅
def memo(): # memo 함수 선언
global memo_text # 메모를 전역변수로 참조
text = request.args.get('memo', '') # 사용가 전송한 memo 입력값을 가져옴
memo_text += text + '\n' # 사용가 전송한 memo 입력값을 memo_text에 추가
return render_template('memo.html', memo=memo_text) # 사이트에 기록된 memo_text를 화면에 출력
|
cs |
/memo 페이지이다.
해당 페이지에서 사용자의 입력값을 받아, render_template에 저장한다.결과적으로 사용자의 입력값을 페이지에 출력하게 된다.
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
28
29
30
31
32
33
34
35
36
37
38
|
def read_url(url, cookie={"name": "name", "value": "value"}):
cookie.update({"domain": "127.0.0.1"})
try:
options = webdriver.ChromeOptions()
for _ in [
"headless",
"window-size=1920x1080",
"disable-gpu",
"no-sandbox",
"disable-dev-shm-usage",
]:
options.add_argument(_)
driver = webdriver.Chrome("/chromedriver", options=options)
driver.implicitly_wait(3)
driver.set_page_load_timeout(3)
driver.get("http://127.0.0.1:8000/")
driver.add_cookie(cookie)
driver.get(url)
except Exception as e:
driver.quit()
# return str(e)
return False
driver.quit()
return True
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)
@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>'
|
cs |
/flag 페이지이다.
해당 페이지에서, 직접 스크립트문을 입력할 수 있다.
/vuln페이지의 param 이라는 파라미터에 입력값이 들어가게 된다.
/vuln 페이지는 문자열 필터링이 없어 xss취약점이 존재하므로 이곳에 공격을 시도해 볼 수 있겠다.
입력값 : <script>location.href="/memo?memo="+document.cookie+</script>
location.href : 링크를 생성한다
document.cookie : 사용자의 쿠키값을 출력
최종적으로 해당 스크립트문은
/vuln 페이지의 param 파라미터에 스크립트문 입력을 할 것이고,
그 내용은, '/memo 페이지의 memo 파라미터에 쿠키값을 출력하게 만드는 링크(URL)' 를 생성한다는 내용
이라고 볼 수 있다.
해당 웹페이지에는 입력받은 URL을 확인하는 봇이 있다.
정상적으로 입력되었다면 봇은 내가 입력한 URL을 확인하였을 것이고,
확인했다면 memo 페이지에서 쿠키값을 출력했을 것이며
memo페이지는 쿠키값을 입력받았기 때문에 해당 쿠키값을 페이지에 게시했을 것이다.
# 쿠키는 FLAG 값이다
한번 확인해 보자.
정상적으로 출력되었다.
728x90
반응형
'Hacking > [Web]DreamHack' 카테고리의 다른 글
DreamHack [simple_sqli] (0) | 2023.03.08 |
---|---|
DreamHack [CSRF-2] (0) | 2023.03.07 |
DreamHack [xss-2] (0) | 2022.09.05 |