본문 바로가기
정보보안/Web Hacking

드림핵 문제풀이 - XSS-2 // XSS, Cross Site Scripting, 우회, 인증우회

by 우동이 2022. 3. 28.
300x250

문제 분류


난이도 : 중상


21년도에 추가된 XSS의 두번째 문제

문제 풀기 전에 먼저 코드부터 살펴보자

 

#XSS-2 의 코드
#!/usr/bin/python3
from flask import Flask, request, render_template
from selenium import webdriver
import urllib
import os

app = Flask(__name__)
app.secret_key = os.urandom(32)

try:
    FLAG = open("./flag.txt", "r").read()
except:
    FLAG = "[**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("/")
def index():
    return render_template("index.html")


@app.route("/vuln")
def vuln():
    return render_template("vuln.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)


app.run(host="0.0.0.0", port=8000)

XSS-1 문제때와 이번 문제의 코드가 완전히 동일하다

물론 제공되지 않은 템플릿 파일은 다를거다.

 

사이트에 접속하면 취약점(vuln) 페이지

메모와 flag 가 있다.

vuln에서 취약점을 테스트 해서 flag에 공격코드를 삽입

이후 메모에서 flag가 출력되는 동일한 구조일테니

먼저 vuln 페이지에서 취약점을 확인해보자

이전 XSS_1 문제에서는 단순한 <script>코드로 XSS 취약점이 작동

메시지를 띄우는 alert 코드가 활성화 되었으나

이번에는 동일한 코드가 삽입되어있음에도 불구하고

alert 코드가 작동하지 않는다

 

이는 결국 사이트에 활성화되어있는 방화벽을 우회 하는 XSS 코드를 넣어야 한다는 의미이다.

 

먼저 XSS 취약점은 

 

악성 스크립트 코드를 사용해 웹 페이지를 이용하는 대상을 공격,
세션 및 쿠키 정보를 탈취하는 취약점이다

즉 웹 페이지에서 취약점을 발생시키는 악성 코드를 막기만 한다면

XSS취약점은 발생하지 않는다는 걸 의미하지만

각종 태그를 이용해 우회하는 방법이 무궁무진 하기때문에

모든 XSS 코드를 일일히 하나하나 막는다는건 불가능하다.

 

이제 여러 공격코드들 중 XSS취약점을 발생시킬만한 코드를 하나씩 삽입해보자.

 

XSS의 우회코드들은 아래 사이트를 참고했다.

>> PortSwigger에서 제공하는 XSS 취약점 Cheat Sheet

 

Cross-Site Scripting (XSS) Cheat Sheet - 2022 Edition | Web Security Academy

Interactive cross-site scripting (XSS) cheat sheet for 2022, brought to you by PortSwigger. Actively maintained, and regularly updated with new vectors.

portswigger.net

>> blog.rubiya.kr 블로그 XSS 필터링 우회 코드 모음

 

브라우저 XSS 필터 우회의 모든 것 – blog.rubiya.kr

이 글은 XSS Auditor, XSS 필터의 우회에 대해 다루고 있다. 대상은 Chrome, Firefox, Edge, IE11, Safari, Opera 이다. 만약 당신이 취약점 진단 업무를 하고있다면 XSS 필터의 우회가 가능하다는 사실을 널리 알

blog.rubiya.kr

 

1. URL이 단독성립 XSS( a태그를 통해 href 속성 이용)

<!--코드원형-->
<a href="javascript:alert(1)">Link</a>
<!--플래그 출력용 변형코드-->
<a href="javascript:location.href="/memo?memo="+document.cookie;">Link</a>

<a>태그에 href 속성을 주고 Link라는 하이퍼링크를 들어가면 alert메시지가 출력되는 구조이다.

단순히 이 코드만으로는 XSS취약점이 발생하기는 했지만

vuln page - 공격코드 삽입
a 태그로 취약점 발생
alert 메시지 발생

하지만 변형코드를 flag에 삽입한다고 memo에서 작동하지는 않더라

<a href="javascript:location.href=""/memo?memo="+document.cookie;">Link</a>

메모에서 Link라는 <a>태그는 작동하지 않았다.. 

실패

2. 2개 이상의 Injection 포인트가 존재할 경우(div 태그 활용)

<!--원형코드-->
<div>'-alert(1)</script><script>'</div>

<!--flag출력용 변형코드-->
<div>`-location.href="/memo?memo=document.cookie;</script><script>`</div>

 

해당 코드는 2개이상의 인젝션 포인트가 있는 경우라고 소개되어 있는데

인젝션 포인트라는데 '과 -의 injection용 문자가 차단되어있지 않은 경우를 가리키는건가 싶다

(이건 잘 모르겠다)

아무튼 <div>태그에 <script>를 넣는데 순서는 섞여있다.

아마 '와-가 해당 코드의 순서를 변형시키는 역할을 하지 않나 싶다.

 

<div>태그 내의 메시지는 출력이 정상적으로 된다.

하지만 안타깝게도 해당 코드는 alert메시지를 발생시키지 못했다.

반쪽짜리 역할을 했기에

반쪽짜리 공격 코드인듯

 

이쯤되니 <script> 태그를 막는 시큐어 코드가 존재하는 듯 하다.

그러면 <script> 코드가 아닌 html 태그만을 활용해 XSS 취약점을 발생시켜야 할것같다.

 

아 추가적으로 간단한 우회법중에

아래와 같이 대소문자를 바꿔 삽입해본 코드도 있었지만

아예 먹히지 않았다.

대소문자 구별 우회

3. SVG-onload 태그 활용

SVG 태그는 html의 문법 중 하나로

Scalable Vector Graphics의 약자로 벡터 기반 그래픽을 XML 형식으로 정의하는것을 의미하는데

즉 SVG그래픽을 담기 위한 태그

 

해당 태그의 Onload 속성을 활용해 코드를 짜보자

PortSwigger 치트시트를 활용했다.

 

PortSwigger - XSS Cheat Sheet

#원형코드
<svg onload=alert(1)>
#flag 출력용 변형코드
<svg onload=location.href="/memo?memo="+document.cookie'>

XSS 취약점 발생

vuln 페이지에서 확인해본 결과 취약점이 발생한다.

이제 변형코드를 flag에 넣어보자

 

<svg onload=location.href="/memo?memo="+document.cookie'>

 

XSS 취약점을 SVG 태그를 통해 flag를 취득했다.

 

 

300x250

댓글