모의해킹/Dreamhack (65) 썸네일형 리스트형 Type c-j • 알아야 할 것!!!!!! - magic hash (PHP에서 사용하는 특수동작) '0' == 0를 비교하면 두 개의 자료형이 달라도 데이터만 일치하며 TRUE를 반환한다.(최적의 자료형을 찾는다 => string >> float >> int 형 순이다) -> A === B을 사용한다 ex) 지수를 통한 인증을 우회하는 방법 : 0e12345 == 0의 결과는 TRUE ID와 Password를 통과를 하며 되는 문제이다. 3개의 PHP 소스가 있지만 우리가 봐야 할 소스는 check.php 만 보면 된다. if((int)$input_id == $id && strlen($input_id) === 10){ echo 'ID pass. '; if((int)$input_pw == $pw && strlen($in.. Broken Buffalo Wings • 이 문제를 풀기 위해 알고 있어야 할 것 - PHP Output Buffer 말그대로 출력할 때 버퍼에 담아놓았다가 일정 이상이 차게 되면 한 번에 출력하게 끔 해준다. 버퍼를 초과하는 문자열을 넘겨준다면 오버플로가 발생하고 출력버퍼는 헤더정보까지 포함하여 비워지게 된다. 메인 페이지를 봤을때, XSS 취약점인가...? 소스 코드를 한번 보자..! random-test #!/usr/bin/python3 from flask import Flask, request, render_template import string import random app = Flask(__name__) try: FLAG = open("./flag.txt", "r").read() # flag is here! except: FLAG = "[**FLAG**]" rand_str = "" alphanumeric = string.ascii_lowercase + string.digits for i in range(4): rand_str += str(random.choice(alphanumeric)) rand_num = random.randint(100, 200) @app.route("/", methods .. amocafe @app.route('/', methods=['GET', 'POST']) def index(): menu_str = '' # 빈문자열 org = FLAG[10:29] # FLAG의 인덱스 10위치에서부터 29까지의 길이을 org에 저장 org = int(org) # org에 저장된 문자을 int형으로 변형 st = ['' for i in range(16)] # 16개의 빈 문자열을 가지는 리스트 st를 생성 # 반복문....으로 연산.. 여기가 중요할듯,,, for i in range (0, 16): # res값은 org에서 4 * i 비트 오른쪽으로 쉬프트 하고 그다음 0xf와 AND 연산을 함 # 즉, org에서 i번째 4비트를 추출함 res = (org >> (4 * i)) & 0xf # res가 .. command-injection-chatgpt 메인화면에는 필요 없는 메시지와 Ping 페이지로 이동하는 메뉴가 있다. 8.8.8.8로 Ping을 보내면 응답값이 출력이 된다. 8.8.8.8;ls을 입력을 했을 때 ping명령어가 실행이 되면서 ;(세미콜론) 뒤에 있는 명령어가 실행이 된다. command Injection에 대한 필터링은 존재하지 않는거같다. 그렇기에 8.8.8.8; cat flag.py을 입력 하면 flag 값을 얻을 수 있다. XS-Search [WEB LEVEL1] XS-Search 공격은 다른 오리진의 비밀 정보를 SOP를 우회하여 쿼리 형태로 한 글자씩 유출하는 형태의 공격이다. 로컬호스트에서만 접근할 수 있는 플래그에 접근하여 한글자씩 유출하는 것이다. 이건 소스코드를 확인을 안하면 못 풀꺼같은 문제이다... if 문을 보면 private가 True이고 remote_addr이 127.0.0.1이 아니고 headers 부분 중 HOST의 값이 127.0.0.1:8000이 아니면 continue로 가는 거 같다. if 문을 빠져나가기 위해서는 HOST 부분에 127.0.0.1:8000을 주면 빠져나오는 거 같다. 버프를 사용해 HOST 값을 127.0.0.1:8000로 수정을 해주고 요청을 보내니까 응답값에 flag 값이 출력이 된다. simple-web-request [WEB LEVEL1] STEP 1부터 한 단계씩 풀어가는 문제이다. param1의 값이 getget 그리고 param2의 값이 rerequest 값이 되면 step2로 넘어가는 소스코드이다. param에 getget , param2에는 rerequest을 입력하면 STEP2로 넘어가진다. /step2 페이지의 소스코드에는 flag에 대한 얻을 정보는 존재하지않는다. /flag 페이지를 보면 prm1 값이 pooost 이고 prm2는 requeeest이다. 소스코드에서 본 값을 param에는 pooost 값을 넣고 param2에는 requeeest값을 넣는다. ex-reg-ex [WEB LEVEL1] input_val 값이랑 'dr\w {5,7} w\d+am@[a-z]{3,7}\.\w+'로 되어 있는 정규화 표현식 와 비교하여 일치하며 flag 값을 출력해 주는 소스코드이다. 정규화식을 해석하면 dr+영숫자 5~7개+e+숫자1개+am+@+소문자 3~7개+.+영숫자 1개이다. 정규화식에 맞는 이메일 값을 넣으면 flag 값이 출력이 된다. post방식으로 작성한 페이로드 import requests url = 'http://host3.dreamhack.games:18603/' data = {'input_val':'dr12345e1am@acd.4'} req = requests.post(url,data=data) print(req.text) 이전 1 2 3 4 5 6 ··· 9 다음