XSS - 2

2026. 1. 1. 16:38·Dreamhack 워게임/Lv.1
반응형

문제 설명

여러 기능과 입력받은 URL을 확인하는 봇이 구현된 서비스 입니다.

XSS 취약점을 이용해 플래그를 획득하세요. 플래그는 flag.txt, FLAG 변수에 있습니다.

 

플래그 형식은 DH{ ... } 입니다.


코드 분석

app.py

try:
    FLAG = open("./flag.txt", "r").read()
except:
    FLAG = "[**FLAG**]"
  • ./flag.txt를 읽기 형식으로 열고, 읽은 것을 FLAG 변수에 삽입
  • 파일이 없거나 읽을 수 없을 때는 [**FLAG**] 를 삽입

 

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
  • cookie.update({"domain" : "127.0.0.1"}) : 쿠키 도메인을 강제로 127.0.0.1로 설정
  • options.add_argument("headless") : GUI 없이 크롬 실행
  • driver.get("http://127.0.0.1:8000/") 후 add_cookie(cookie) : 쿠키는 "현재 접속중인 도메인" 컨텍스트가 있어야 넣을 수 있어 먼저 127.0.0.1에 접속한 다음 쿠키를 심는 구조
  • driver.omplicitly_wait(3), set_page_load_timeout(3) : 제한 시간 3초

 

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)
  • urlib.parse.quote(param) : 사용자가 넣은 param 을 URL에 안전하게 붙이려고 URL 인코딩을 함
  • 봇이 여는 URL은 http://127.0.0.1:8000/vuln?param= "사용자 입력" 형태

 

@app.route("/")
def index():
    return render_template("index.html")
  • index.html 페이지 렌더링 함

 

@app.route("/vuln")
def vuln():
    return render_template("vuln.html")
  • vuln.html 페이지를 렌더링 함
  • XSS - 1과 달리 /vuln 엔드포인트에 <script>alert(1)</script> 같은 payload 입력해도 스크립팅 되지 않음

 

@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>'
  • GET: flag.html 페이지 보여줌
  • POST: 사용자가 제출한 param을 가지고 check_xss() 를 실행
  • 여기서 쿠키를 넘기는게 {name: flag ,  value : FLAG.strip() } 임
    즉, 봇 브라우저에 flag = <플래그 값> 쿠키를 심고 /vuln?param = ... 을 방문하게 함
  • 실패시 wrong , 성공시 good 

 

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)
  • /memo?memo = ??? 오면 memo_text에 저장

vuln.html

{% extends "base.html" %}
{% block title %}Index{% endblock %}

{% block head %}
  {{ super() }}
  <style type="text/css">
    .important { color: #336699; }
  </style>
{% endblock %}

{% block content %}
    <div id='vuln'></div>
    <script>var x=new URLSearchParams(location.search); document.getElementById('vuln').innerHTML = x.get('param');</script>
{% endblock %}
  • innerHTML은 요소 안의 들어갈 내용을 HTML로 해석
  • 따라서 param에 hello글자가 들어가면 글자만 출력
  • param 값에 <b>굵게</b> 하면 굵게 렌더링 
  • innerHTML은 HTML5 부터 <script> 태그가 실행되지 않게 끔 설정 됨 따라서, 다른 태그로 우회를 해야함

문제 풀이

vuln (xss) page

  • <script>alert(1)</script> 입력이 들어가있는 것을 알 수 있음

memo page

  • XSS - 1 과 같이 /memo?memo = hello 가 hello 그대로 메모장에 적혀있는 것을 볼 수 있음

flag page

흐름 정리

1) /flag 페이지에서 param 을 입력하고 전송함

  • GET 이면 단순히 flag.html 보여줌
  • POST로 제출하면 서버는 param을 꺼냄

2) 서버는 봇이 열 URL을 만들고 봇을 실행시킴

  • 서버는 param을 URL로 만들고, URL을 봇이 열어보게 함
  • http://127.0.0.1:8000/vuln?param= ???

3) 봇이 메인 (/) 에 접속하고, 그 다음 flag 쿠키를 심음

  • 봇이 http://127.0.0.1:8000/ 접속
  • 쿠키 추가 flag = (서버가 읽은 FLAG 값)
  • 그 다음에 /vuln?param=??? 로 이동

 

여기서 <script></script>를 막아뒀으니 다른 태그를 사용

<img>

<img src = "yeonseok" onerror="location.href='/memo?memo='+document.cookie">
  • img src ="yeonseok" : 웹 페이지에 이미지를 띄우려고 하는 태그
  • onerror = " ..." : 에러 발생 시 실행되는 자바스크립트 이벤트
  • location.href :주소로 바로 이동(리다이렉트)시킴
  • '/memo?memo=' + document.cookie : /memo 경로에 document.cookie 값을 가져옴

그 외에도 <iframe>, <svg> 등 다양한태그로 우회가능하니 찾아보기

반응형

'Dreamhack 워게임 > Lv.1' 카테고리의 다른 글

simple_sqli  (1) 2026.01.15
csrf-2  (1) 2026.01.11
csrf - 1  (0) 2026.01.11
session-basic  (0) 2026.01.09
XSS -1  (0) 2025.12.31
'Dreamhack 워게임/Lv.1' 카테고리의 다른 글
  • csrf-2
  • csrf - 1
  • session-basic
  • XSS -1
y3onbug5
y3onbug5
y3onbug5 님의 블로그 입니다.
  • y3onbug5
    y3onbug5 님의 블로그
    y3onbug5
  • 전체
    오늘
    어제
    • 분류 전체보기 (167) N
      • Alpacahack (19) N
      • Dreamhack 워게임 (49)
        • Lv.1 (40)
        • Lv.0 (4)
        • LV.2 (3)
        • LV.3 (2)
      • [Dreamhack] Web Beginner (3)
      • [Dreamhack] Web Hacking (17)
        • 웹 기초 지식 (4)
        • Cookie & Session (2)
        • Cross-Site Scripting(XSS) (1)
        • Cross-Site Request Forgery (1)
        • SQL Injection (4)
        • NoSQL Injection (2)
        • Command Injection (1)
        • File Vulnerability (1)
        • Server-Side Request Forgery (1)
      • [Dreamhack] Web Hacking Client-Side (10)
        • XSS Filtering Bypass (2)
        • Content Security Policy (CSP) (2)
        • CSRF,CORS Bypass (2)
        • Client-Side Template Injection (CSTI) (1)
        • CSS Injection (1)
        • Relative Path Overwrite (RPO) (1)
        • DOM Vulnerability (1)
      • [Dreamhack] Web Hacking Server-Side (15)
        • SQL Injection Advanced (4)
        • SQL Injection Advanced - Fingerprinting (2)
        • NoSQL Injection Advanced (3)
        • Command Injection Advanced - Web Servers (3)
        • File Vulnerability Advanced - Web Server (3)
      • [Dreamhack]Black-Box Penetration Testing (15)
        • DreamCommunity Penetration Testing (11)
      • [Dreamhack] LLM (2)
        • [Dreamhack] LLM과 프롬프트 엔지니어링 (2)
      • Web 공부 (4)
      • Web Study (15)
      • JavaScript (17)
        • 기초 (12)
        • 중급 (4)
      • 웹 개발(Flask) (0)
      • [Security First] web 기초교육 (1) N
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    DreamHack
    webstudy
    xss
    LLM
    alpacahack
    hacking
    cve
    드림핵
    webhacking
    JS
    CSRF
    web
    JavaScript
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
y3onbug5
XSS - 2
상단으로

티스토리툴바