본문 바로가기

Web Hacking/Dreamhack

(52)
[Dreamhack] web-deserialize-python write up 코드를 보면 몇줄 안된다. #!/usr/bin/env python3 from flask import Flask, request, render_template, redirect import os, pickle, base64 app = Flask(__name__) app.secret_key = os.urandom(32) try: FLAG = open('./flag.txt', 'r').read() # Flag is here!! except: FLAG = '[**FLAG**]' INFO = ['name', 'userid', 'password'] @app.route('/') def index(): return render_template('index.html') @app.route('/create_session'..
[Dreamhack] login-1 write up 코드를 보자 #!/usr/bin/python3 from flask import Flask, request, render_template, make_response, redirect, url_for, session, g import sqlite3 import hashlib import os import time, random app = Flask(__name__) app.secret_key = os.urandom(32) DATABASE = "database.db" userLevel = { 0 : 'guest', 1 : 'admin' } MAXRESETCOUNT = 5 try: FLAG = open('./flag.txt', 'r').read() except: FLAG = '[**FLAG**]' def mak..
[Dreamhack] what-is-my-ip write up 으음.. 퍼블로 푸신분이 4분인데, 나 퍼블 먹었을지도? 내 아이피가 바로 나오고 있다. 코드를 살펴봅시다. user_ip라는 변수에 내 아이피를 담고, echo 해주고 그걸 화면에 보여주고 있다. flag는 /flag에 위치하니 command injection을 통해 가져오면 된다. 할 건 내 ip 변조.. 근데 사실 ip변조는 앱 계층 단에서는 불가능하지만, 코드를 보면 request.access_route 라는 게 존재한다. 뭔가 싶어서 찾아보니 forwarded 헤더가 존재하면 client ip부터 마지막 proxy ip까지 배열로 담고 있는 놈이다. X-Forwarded-For 라는 헤더는 만약 http request가 프록시 서버를 거칠 경우 원래 요청 ip주소를 담고 있는 헤더이다. 이 헤더..
[Dreamhack] out of money write up web + misc 드핵, 드냥, 드멍 코인이 있다. 드핵 코인을 통해 flag를 살 수 있지만, 드핵 코인을 빌린 빛이 없어야 flag를 살 수 있다. 각각의 코인은 상호 교환이 가능하다. 드림 유동성 풀로 이동하면 드냥 코인을 예금할 수도 있고, 담보로 교환이 가능하다. 여기서 코드를 보면 드냥 코인의 담보로 빌릴 수 있는 드멍 코인의 한도가 정해진다. 근데 드멍 코인을 빌린다고 해도 드냥 코인의 담보가 줄어들지 않기 때문에 드멍 코인을 빌릴 한도 역시 줄어들지도 않는다. 따라서 드멍 코인을 무한으로 즐길 수 있다 ㄷㄷ.. 드멍 코인은 드핵 코인으로 교환이 가능하다.
[Dreamhack] tmitter write up 문제 설명으론 테이블 생성 쿼리문 하나만 알려준다. 위 사진은 서버에 접속했을 때 index 화면이다. 로그인과 회원가입이 있다. 회원가입 창으로 이동 후 개발자 도구를 보면 admin으로 가입 하라는 힌트가 보인다. admin으로 가입 후 로그인 하면 flag가 출력될 것 같다. 일단 꽤 푸는데 고민을 많이 한 문제이다. 먼저, 1. char 특징 이용-1 char 특성상 char(32) 와 같이 선언할 경우 32바이트가 안 채워지면 문자열 뒤에를 공백으로 채워 32바이트를 만든다. 따라서 admin%20으로 우회를 시도했지만 실패했다. 2. 로직 버그 이용 백엔드 로직을 추측해보면 id가 있는지 확인한 다음에 insert문을 날릴 것이다. 때문에 select로 조회를 먼저 진행한다. 즉 %20admi..
[Dreamhack] [wargame.kr] login filtering write up 위는 문제 화면이다. 코드를 보면 위는 php 코드이다. 사용자 입력을 받아 두 번의 필터링을 거쳐 쿼리문을 DB에 날린다. 우선 주목해야할 부분이 몇 부분 있다. 1. 쿼리문의 문자열 인코딩을 utf8로 설정한 점 2. mysqli_real_escape_string() 함수를 통해 싱글쿼터를 이스케이프 하는 점 3. trim() 함수를 통해서 공백을 제거한 점 이제 플래그가 나오는 부분을 보자. 위 사진을 보면 flag는 쿼리의 반환 결과로 id라는 컬럼이 존재하며, 그 id 값이 guest, blueh4g가 아닐 때 echo 된다. mysql에서는 대소문자를 구분하지 않는다는 점이 하루가 지나고 보니 생각났다.. 하하...
[Dreamhack] simple_sqli_chatgpt write up 오호라 중요 코드 부분을 보면 if os.path.exists(DATABASE) == False: db = sqlite3.connect(DATABASE) db.execute('create table users(userid char(100), userpassword char(100), userlevel integer);') db.execute(f'insert into users(userid, userpassword, userlevel) values ("guest", "guest", 0), ("admin", "{binascii.hexlify(os.urandom(16)).decode("utf8")}", 0);') db.commit() db.close() userid가 guest이고 admin인 user가 한 ..
[Dreamhack] simple-ssti write up SSTI 취약점이 발생하는 문제이다. SSTI란 Server Side Template Injection의 약자로 사용자 입력값이 템플릿으로 해석되어 발생하는 오류이다. 코드를 보자. 코드를 보면 errorhandler가 존재한다. 404에러에 대한 로직을 처리하는 것 같다. 404 에러가 발생한 경로를 가져와 템플릿으로 정의한 변수에 넣고 있다. 이 변수는 render_template_string 함수의 인자로 넘어간다. render_template_string 함수는 템플릿 구문을 해석한다. flask는 기본적으로 Jinja2 템플릿 언어를 제공하기 때문에 그에 맞는 템플릿 인젝션을 해야 한다. 템플릿 언어에 따라 페이로드가 달라질 수 있다. 위 사진은 언어를 구분하는 방법을 도식화한 사진이다. {{7..