Hacking/[Web]DreamHack

DreamHack [xss-1]

양선규 2022. 8. 4. 17:33
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 값이다

 

한번 확인해 보자.

 

입력 후 반응

 

 

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