Fishing
·
Dreamhack 워게임/Lv.1
문제설명문제 설명낚시.. 좋아하시나요..?사용된 이미지는 모두 nocopyright 이미지를 사용하였습니다.코드분석FISHLIST_PATH = 'fishlist.txt'FLAG_IMAGE_PATH = 'flag.jpg'def load_fishes(): fishes = [] grade = None with open(FISHLIST_PATH, encoding="utf-8") as f: for line in f: line = line.strip() if not line: continue if line.startswith("등급"): grade = line.split(":..
Really Not SQL
·
Dreamhack 워게임/Lv.1
문제설명Really not SQL, Just JSON코드분석edit.profilesession에 저장된 user값이 admin이 아니면 에러메시지 출력userDir은 현재 디렉터리 기준으로 user 폴더 생성username과 password는 사용자로부터 입력받음파일명은 username.json 으로 생성 / 파일 경로는 userDir.파일명으로 생성ex) admin.json / user/admin.json만약 username이 admin, guest 아니면 에러메시지 출력$filepath의 내용을 읽어서 json을 php 형태로 바꿈파일에서 읽은 id와 사용자가 입력한 username이 다르면 에러아이디가 일치하면 password를 sha256 해시해서 저장파일내용을 json 형태로 다시 씀flag.p..
ez_race
·
Dreamhack 워게임/Lv.1
문제설명3초 안에 키를 찾을 수 있나요?코드분석@app.route('/race')def race(): global getflag, key user_input_str = request.args.get('user') if user_input_str is None: return "Please use user parameter" try: userinput = int(user_input_str) except ValueError: return "ERROR" if userinput == key: getflag = 1 return "WOW" else: time.sleep(3) key = rand..
My Best Friend
·
Dreamhack 워게임/Lv.1
문제설명드림이는 자신이 한 말에 무조건 인사해주는 웹 서비스를 만들었어요! 하지만 서비스가 최근 이상한 동작을 한다는 제보가 들어왔어요 플래그 형식은 null{...}입니다코드분석app.get('/', (req, res) => { return res.sendFile(path.join(__dirname, "..", "greet.html"));});메인화면 greet.html을 반환해주는 코드app.get('/api', (req, res) => { if (req.ip !== '::1') return res.send('No'); const isAdmin = Number(req.query.admin); console.log('isAdmin', isAdmin); if (isAdmin !== 0) { ..
Hangul - Revenge
·
Dreamhack 워게임/Lv.1
문제설명Hangul 문제의 언인텐 취약점을 수정하였습니다.플래그 파일은 /home/hangul/flag에 있습니다.플래그의 형식은 WaRP{...}입니다.코드분석@app.route("/", methods=["GET", "POST"])def index(): message = "" if request.method == "POST": message = request.form["message"] if re.search("[a-zA-Z]", message): message = "한글을 사용합시다!" for i in "!@#$%^&*=;,?1234567890": if i in message: messa..
Ctrl-C
·
Dreamhack 워게임/Lv.1
문제설명Copy it if you can! 플래그의 형식은 WaRP{...}입니다.코드 분석import hashlibimport base64def bytes_to_long(a): return int.from_bytes(a, byteorder='big')def long_to_bytes(a): return a.to_bytes((a.bit_length()+7)//8, byteorder='big')print(long_to_bytes(548488142063681088110499188198346596132432266189304030893626^bytes_to_long(base64.b64encode(hashlib.sha256(input().rstrip().encode('utf-8')).digest())[1..
CVE-2022-29078
·
Web Study
드림핵 ejs@3.1.8 문제를 보고 분석을 해보았다.해당 취약점은 CVE-2022-29078 취약점을 기준으로 EJS 엔진에서 SSTI 취약점이 발견되었고 RCE까지 가능했던 취약점이다. EJS란: EJS(Embedded JavaScript templates)의 줄임말로, Node.js에서 많이 쓰는 서버 사이드 템플릿 엔진서버에서 HTML을 만들 때, HTML 안에 같은 문법으로 값을 끼워넣거나/JS로직을 실행해서 완성된 HTML 문자열을 만들어 브라우저로 내려준다. SSTI란: 사용자 입력이 템플릿으로 들어가서, 템플릿 엔진이 그 입력을 데이터가 아니라 템플릿/코드/옵션처럼 해석해버리는 취약점위 취약점은 사용자 입력으로 EJS 렌더 옵션을 덮어써서 템플릿 컴파일 시 생성되는 JS 코드에 악성 구문..
Pearfect Markdown
·
Dreamhack 워게임/Lv.1
문제설명실시간으로 마크다운을 수정해 볼 수 있는 페이지입니다. 서비스의 취약점을 찾고 익스플로잇하여 플래그를 획득하세요! 플래그 형식은 DH{...} 입니다.코드분석index.phpUploaded Files"; while (false !== ($entry = readdir($handle))) { if ($entry != "." && $entry != "..") { echo "" . htmlspecialchars($entry) . ""; } } closedir($handle); echo "";}?>업로드 폴더 경로 지정uploads/ 디렉터리 열고 성공 시 실행 → 제목과 시작 태그 출력디렉터리 안의 파일 이름 하나씩 읽음 (현재(.), 상위(..)는 ..
Simple Note Manager
·
Dreamhack 워게임/Lv.1
문제설명노트를 관리하는 간단한 웹 서비스입니다. 취약점을 찾고 익스플로잇 하여 플래그를 획득하세요! 플래그 형식은 DH{...} 입니다.코드 분석def backup_notes(timestamp): with lock: with open('./tmp/notes.tmp', 'w') as f: f.write(repr(notes)) subprocess.Popen(f'cp ./tmp/notes.tmp /tmp/{timestamp}', shell=True)backup_notes를 정의하는 함수./tmp/notes.tmp 파일을 쓰기 모드로 열음/tmp/{timestamp}로 복사 / shell 명령어 True@app.route('/backup_notes', metho..
Logical
·
Dreamhack 워게임/Lv.1
문제설명간단한 논리를 깨다.코드분석hidden_dir = '/dir_' + str(randint(1, 99999999999999999))hidden_dir 은 /dir_???값으로 이뤄져있음. ???은 1~99999999999999999 사이값@app.route('/', methods=['GET','POST'])def login(): if request.method == 'GET': return render_template('login.html') elif request.method == 'POST': if not login_check(): return render_template('login.html', error='Something wrong w..