Dreamhack - Csrf2 (수정)

2024. 4. 5. 11:52·DreamHack

 

 

 

 

저번이랑 똑같은 형태에 문제인 거 같다.

 

 

 

 

 

 

 

 

 

#!/usr/bin/python3
from flask import Flask, request, render_template, make_response, redirect, url_for
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
import urllib
import os

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

try:
    FLAG = open("./flag.txt", "r").read()
except:
    FLAG = "[**FLAG**]"

users = {
    'guest': 'guest',
    'admin': FLAG
}

session_storage = {}

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()
        print(str(e))
        # return str(e)
        return False
    driver.quit()
    return True


def check_csrf(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():
    session_id = request.cookies.get('sessionid', None)
    try:
        username = session_storage[session_id]
    except KeyError:
        return render_template('index.html', text='please login')

    return render_template('index.html', text=f'Hello {username}, {"flag is " + FLAG if username == "admin" else "you are not an admin"}')


@app.route("/vuln")
def vuln():
    param = request.args.get("param", "").lower()
    xss_filter = ["frame", "script", "on"]
    for _ in xss_filter:
        param = param.replace(_, "*")
    return param


@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", "")
        session_id = os.urandom(16).hex()
        session_storage[session_id] = 'admin'
        if not check_csrf(param, {"name":"sessionid", "value": session_id}):
            return '<script>alert("wrong??");history.go(-1);</script>'

        return '<script>alert("good");history.go(-1);</script>'


@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'GET':
        return render_template('login.html')
    elif request.method == 'POST':
        username = request.form.get('username')
        password = request.form.get('password')
        try:
            pw = users[username]
        except:
            return '<script>alert("not found user");history.go(-1);</script>'
        if pw == password:
            resp = make_response(redirect(url_for('index')) )
            session_id = os.urandom(8).hex()
            session_storage[session_id] = username
            resp.set_cookie('sessionid', session_id)
            return resp 
        return '<script>alert("wrong password");history.go(-1);</script>'


@app.route("/change_password")
def change_password():
    pw = request.args.get("pw", "")
    session_id = request.cookies.get('sessionid', None)
    try:
        username = session_storage[session_id]
    except KeyError:
        return render_template('index.html', text='please login')

    users[username] = pw
    return 'Done'

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

 

문제에 대한 소스코드이다.

 

저번 문제랑 동일하게 vuln 에는 필터링이 있다.

 

change_password라는 핸들러가 있다. [웹에서 특정한 요청을 대한 처리를 담당하는 함수 or 메서드]

이걸 이용할 거 같다.

 

change_password는 GET 요청을 받는다.

"pw"라는 이름에 파라미터를 사용한다는 걸 알 수 있다.

 

그러면 flag에 form을 이용하여 change_password를 동작시켜 admin password를 바꿔보자.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

문제 화면이다.

 

 

 

 

 

 

 

 

 

 

 

flag 페이지이다. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

여기에 코드를 넣도록 하자.

 

 

이미지 태그를 이용해서 GET 요청을 하면 비밀번호를 변경할 수도 있을거같다.

 

한번 변경해 보자.

 

 

 

 

 

 

 

 

 

 

flag에서 alert "good" 이 출력된다.

 

 

 

 

 

 

 

 

 

 

 

 

로그인해 보자.

 

 

 

 

 

'DreamHack' 카테고리의 다른 글

DreamHack - command-injection-1  (0) 2024.05.31
DreamHack - simple-ssti  (0) 2024.05.17
DreamHack - image-storage  (0) 2024.05.17
DreamHack - baby-sqlite  (0) 2024.04.30
Dreamhack - csrf1 (Cross-Site Request Forgery) (수정)  (0) 2024.04.05
'DreamHack' 카테고리의 다른 글
  • DreamHack - simple-ssti
  • DreamHack - image-storage
  • DreamHack - baby-sqlite
  • Dreamhack - csrf1 (Cross-Site Request Forgery) (수정)
G_OM
G_OM
최대한 설명 열심히 하려고 합니다. 궁금한 거 있으면 언제든지 물어보셔도 좋습니다.
  • G_OM
    끄적끄적
    G_OM
  • 전체
    오늘
    어제
    • 분류 전체보기 (139)
      • 모의해킹 (8)
      • Wargame (69)
        • Linux_bandit (33)
        • Webhacking.kr (36)
      • DreamHack (52)
        • WEB (14)
        • Reverising (9)
        • System (0)
        • CTF (22)
      • Android_security (5)
      • 정보보안기사 (2)
      • IT? (3)
  • 블로그 메뉴

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

  • 공지사항

    • DreamHack 에 대한 문제들...
  • 인기 글

  • 태그

    drozer
    wargame
    워게임
    insecurebankv2
    union
    정보보안기사
    Linux
    bandit18
    url encode
    Cookie
    CTF
    webhacking
    Dreamhack
    bandit20
    cookies
    안드로이드
    bandit30
    리눅스
    php wrapper
    webhacking.kr
    Linux wargame
    sql injection
    overthewire
    bandit17
    난독화
    리눅스 워게임
    Android
    lfi
    bandit
    php
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
G_OM
Dreamhack - Csrf2 (수정)
상단으로

티스토리툴바