Alpaca Rangers
·
Alpacahack
문제설명Topic: LFI분야: Web난이도: MediumHero of Justice, Alpaca Rangers!코드분석buffer($contents) ?: 'application/octet-stream'; $dataUri = 'data:' . $mimeType . ';base64,' . base64_encode($contents); } }}?>URL의 ?img= ... 값을 가져옴 없으면 공백img의 값이 있을 때 수행/ 또는 \\로 시작하면 차단, ..이 포함되어도 차단 → 차단할때 에러메시지 출력사용자 입력 경로의 파일 내용을 읽음 @는 에러메시지를 숨김만약 파일 읽기 실패 시 not found 출력파일 내용을 base64로 인코딩해서 data: URL 문자열..
omikuji
·
Alpacahack
문제설명Topic: [Mirror] TSG LIVE! CTF주제: Web난이도: MediumCaffe-de-mancy코드분석function randomString() { return Math.floor(Math.random() * 4294967296).toString(16)}0 ~ 2^32 까지의 난수생성하고 16진수 문자열로 바꿈async function getResultContent(type) { return await readFile(`${import.meta.dirname}/${type}`, 'utf-8')}import.meta.dirname: 이 코드를 담고 있는 파일이 위치한 폴더 경로를 뜻함 WORKDIR /appserver.js를 /app/로 복사CMD ["node", "server.j..
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..
Emojify
·
Alpacahack
문제설명Topic: Server-Side주제: Web난이도: Medium:pizza: -> 🍕코드분석frontend / index.jsconst waf = (path) => { if (typeof path !== "string") throw new Error("Invalid types"); if (!path.startsWith("/")) throw new Error("Invalid 1"); if (!path.includes("emoji")) throw new Error("Invalid 2"); return path;};waf은 경로가 문자열이어야 하고, "/" 로 시작하며, emoji를 포함하고 있어야 한다.express() .get("/", (req, res) => res.type("html..
Log Viewer
·
Alpacahack
문제설명Topic: Remote Code Execution분야: Web난이도: MediumSimple log viewer with regex feature.코드분석@app.route("/", methods=["GET", "POST"])def index(): query = "" log = "" if request.method == "POST": query = request.form.get("query", "") command = ["awk", f"/{query}/", "info.log"] result = subprocess.run( command, capture_output=True, timeo..
AWK Code Injection
·
Web Study
AWKAWK는 Unix/Linux에서 텍스트 처리에 사용되는 프로그래밍 언어/도구이다.파일이나 입력 스트림에서 패턴을 찾고 처리하는 데 매우 강력하다.Code Injection코드 인젝션(Code Injection)이란, 공격자가 프로그램이 처리하는 입력값에 악성 코드를 삽입해 프로그램이 의도치 않은 동작을 하도록 만드는 공격이다. 사용자 입력을 AWK 명령에 그대로 포함시킬 때 취약점이 생긴다.취약점 코드 예시#!/bin/bash# 사용자로부터 검색할 이름을 입력받아 파일에서 찾는 스크립트USER_INPUT="$1"awk "/$USER_INPUT/ { print }" users.txt쉘 스크립트에서 사용자 입력을 AWK에 직접 넣는 경우가 대표적이다.정상적인 사용./search.sh "Alice"# →..
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..
Test Your Luck
·
Dreamhack 워게임/Lv.1
문제설명Test Your Luck~🍀 숫자를 맞히고 플래그를 찾아주세요! 플래그 형식은 DH{...} 입니다.코드분석NUMBER_RANGE = (0, 10000)TARGET_NUMBER = random.randint(*NUMBER_RANGE)0~10000까지 랜덤한 숫자 TARGET_NUMBER 변수에 삽입@app.route('/')def index(): return render_template('index.html', range=NUMBER_RANGE)메인화면엔 index.html 템플릿 렌더링해서 보여줌@app.route('/guess', methods=['POST'])def guess_number(): user_guess = int(request.form['guess']) ..
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..