Web Hacking/Dreamhack 풀이 18

DOM XSS

문제 정보 https://dreamhack.io/wargame/challenges/438 DOM XSS Description Exercise: DOM XSS에서 실습하는 문제입니다. 문제 수정 내역 2023.08.11 Dockerfile 제공 dreamhack.io 풀이 문제 웹 사이트에 접속해보면 vuln, memo, flag의 페이지가 존재하고, vuln 페이지에서 DOM XSS의 취약점이 있을 것처럼 보인다. memo는 flag를 보여주는 페이지, flag는 사용자로 요청을 수행하는 걸로 보인다. 아래는 문제 소스 코드의 일부인데, CSP에 strict-dynamic이 있는 것을 볼 수 있다. strict-dynamic은 이미 허용된 스크립트의 내부에서 동적으로 생성된 스크립트를 허용하는 옵션이다...

Relative Path Overwrite Advanced

문제 정보 https://dreamhack.io/wargame/challenges/440 Relative Path Overwrite Advanced Description Exercise: Relative Path Overwrite의 패치된 문제입니다. 문제 수정 내역 2023.08.10 bot.py 수정, Dockerfile 제공 dreamhack.io 풀이 전에 풀었던 RPO 문제의 Advanced 문제이다. 먼저 flag 값이 어디있는지 확인해보면 RPO 문제와 동일하게 사용자의 쿠키 값에 flag 값을 저장한다는 것을 볼 수 있다. def check_xss(path, cookie={'name': 'name', 'value': 'value'}): url = f'http://127.0.0.1/{path..

Relative Path Overwrite

문제정보 https://dreamhack.io/wargame/challenges/439 풀이 해당 문제에 접속하면 Home, Vuln Page, Report 3개의 페이지가 존재한다. 참고로 반응형 웹 페이지가 아니므로 전체화면으로 해야 입력 폼이나 메모들을 볼 수 있다. Vuln Page에 접속하게 되면 아래와 같이 param의 파라미터 값이 그대로 출력되는 것을 확인할 수 있다. Report 페이지를 보면 http://127.0.0.1로 요청을 보내는 것으로 보아 Request bin을 이용해야 할 것 같다. 아래는 문제 파일 안의 bot.py 소스 코드이다. 여기서 flag값이 어디 있는지 확인할 수 있는데, check_xss 함수와 not check_xss 함수를 보면 사용자의 쿠키가 flag값으..

Addition calculator

해당 문제는 Dreamhack CTF Season 4 Round #10 (🌱Div2) 에 출제된 문제입니다. 문제 설명 덧셈 식을 입력하면 계산 결과를 출력하는 웹 서비스입니다. ./flag.txt 파일에 있는 플래그를 획득하세요. 플래그 형식은 DH{...} 입니다. 풀이 app.py의 소스 코드는 다음과 같다. #!/usr/bin/python3 from flask import Flask, request, render_template import string import subprocess import re app = Flask(__name__) def filter(formula): w_list = list(string.ascii_lowercase + string.ascii_uppercase + str..

Client Side Template Injection 풀이

문제 정보 Exercise: Client Side Template Injection에서 실습하는 문제입니다. 풀이 먼저 문제 파일인 app.py의 소스 코드는 다음과 같다. #!/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) nonce = os.urandom(16).hex() try: FLAG = open("./flag.txt", "r").read() except: FLAG = "[**FLAG**]" def read_url(url, cooki..

CSRF Advanced

문제 정보 Exercise: CSRF Advanced에서 실습하는 문제입니다. 풀이 문제 파일인 app.py의 소스 코드는 다음과 같다. #!/usr/bin/python3 from flask import Flask, request, render_template, make_response, redirect, url_for from selenium.webdriver.common.by import By from selenium import webdriver from hashlib import md5 import urllib import os app = Flask(__name__) app.secret_key = os.urandom(32) try: FLAG = open("./flag.txt", "r").read(..

file-download-1

file-download-1 문제 정보 File Download 취약점이 존재하는 웹 서비스입니다. flag.py를 다운로드 받으면 플래그를 획득할 수 있습니다. 풀이 접속하면 먼저 Your uploaded memos가 출력되는걸 볼 수 있다. Upload My Memo에 들어가면 Filename과 Content에 입력란이 있다. 먼저 Filename과 Content에 123, 123을 한 번 넣어봤다. 다시 메인 홈페이지로 돌아와서 확인해보면 123이라는 파일이 업로드 되어 있다. 123의 파일 링크를 한 번 확인해보려면 웹페이지 좌측 하단에 검은색으로 파일 링크가 있는걸 확인할 수 있다. 문제를 살펴보자 import os import shutil from flask import Flask, reque..

image-storage

image-storage 문제 정보 php로 작성된 파일 저장 서비스입니다. 파일 업로드 취약점을 이용해 플래그를 획득하세요. 플래그는 /flag.txt에 있습니다. 풀이 제일 처음 접속 화면이다. Upload 페이지이다. 파일을 선택해서 Upload할 수 있다. 그래서 아무거나 한 번 올려보았다. 다음과 같이 List 페이지에 잘 저장된다. 문제를 한 번 살펴보자 upload.php 밑에 있는 코드를 살펴보면 파일을 올릴 때 파일 이름은 걸러주지만 파일의 확장자는 검사하지 않는 것을 확인할 수 있다. list.php 밑의 코드를 살펴보면 .. . index.html 을 빼고 보여주는 것을 알 수 있다.

command-injection-chatgpt

command-injection-chatgpt 문제 정보 특정 Host에 ping 패킷을 보내는 서비스입니다. Command Injection을 통해 플래그를 획득하세요. 플래그는 flag.py에 있습니다. 풀이 먼저 접속하면 이런 화면이 뜬다. 이 페이지는 특정 Host에 ping 패킷을 보내는 서비스를 제공한다. 제공된 웹 페이지에서 입력한 Host로 ping을 보내는 기능이 있다. 입력란에 127.0.0.1을 입력했다. 핑 결과가 화면에 출력되었다. 20번 줄을 보면 해당 코드는 변수 **host**에 지정된 IP 주소나 도메인 이름으로 3회의 ICMP 패킷을 보내는 ping 명령어를 실행하는 명령어 문자열을 생성한다. ping 명령어는 특정 호스트에 대한 응답 시간을 측정하는 명령어이다. 이 때,..