본문 바로가기

전체 글

(113)
[드림핵 워게임] random-test 문제 사이트에 접속하면 처음으로 보이는 페이지이다. 알파벳 소문자와 숫자로 이루어진 4자리 문자열을 사물함 번호에 입력하고 100 이상 200 이하의 정수를 자물쇠 비밀번호에 입력해보았다. Wrong! 이라는 결과가 뜬다. 이제 코드를 살펴본다. @app.route("/", methods = ["GET", "POST"]) def index(): if request.method == "GET": return render_template("index.html") else: locker_num = request.form.get("locker_num", "") password = request.form.get("password", "") if locker_num != "" and rand_str[0:len(lo..
[드림핵 워게임] web-deserialize-python 문제 사이트에 처음 접속하면 뜨는 페이지이다. /create_session 페이지에 접속해본다. 값을 입력해본다. @app.route('/create_session', methods=['GET', 'POST']) def create_session(): if request.method == 'GET': return render_template('create_session.html') elif request.method == 'POST': info = {} for _ in INFO: info[_] = request.form.get(_, '') data = base64.b64encode(pickle.dumps(info)).decode('utf8') return render_template('create_ses..
[드림핵 워게임] file-csp-1 문제 사이트에 접속하면 처음 보이는 페이지이다. TEST YOUR CSP!라는 문구가 나오는데, CSP란 Content Security Policy의 약자로 XSS 공격을 막기 위해 지정한 규칙을 만족하는 스크립트 또는 CSS 만 허용하는 정책이다. /test 페이지로 들어가보면 CSP 입력창이 뜬다. Test your CSP Your own CSP test.html의 코드를 살펴보면 입력폼을 전송하면 /live로 넘어가는 것을 확인할 수 있다. @APP.route('/live', methods=['GET']) def live_csp(): csp = request.args.get('csp', '') resp = make_response(render_template('csp.html')) resp.head..
[드림핵 워게임] mongoboard 문제 사이트에 접속하면 처음으로 볼 수 있는 페이지이다. MongoDB에 저장된 게시물 목록을 볼 수 있고 게시물을 작성할 수 있는 기능이 있는 것 같다. 맨 위에 있는 게시물을 클릭해보면 World! 라는 게시물 내용을 볼 수 있다. no가 없는 admin이 작성한 FLAG라는 게시물을 클릭해보면 Secret Document!라는 alert창이 뜨고 내용을 보여주지 않는다. var boardSchema = new Schema({ title: {type:String, required: true}, body: {type:String, required: true}, author: {type:String, required: true}, secret: {type:Boolean, default: false}, p..
[드림핵 워게임] [wargame.kr] fly me to the moon 문제 사이트에 접속하면 처음으로 보이는 페이지이다. 문제에 나와있는대로 자바스크립트로 만든 게임인 것 같다. 클릭해서 게임을 플레이해본다. 우주선이 터널 벽에 닿으면 Game over가 되면서 YOU NEED GET THE SCORE 31337 이라는 메시지가 뜬다. SCORE가 31337이 될 때까지 플레이하려면 아주 많은 시간과 노력이 걸리므로 javascript 코드를 수정해서 SCORE 값을 저장하는 변수에 임의로 31337을 입력해줄 것이다. 개발자도구(F12)를 열어서 Elements 탭에서 script 코드가 있는 태그를 살펴보았다. 안에서 난독화 되어있는 script 코드를 찾을 수 있었다. 난독화되더있는 javascript를 디코딩해주는 사이트가 있다. https://beautifier...
[드림핵 워게임] [wargame.kr] strcmp 문제 사이트에 접속하면 처음으로 볼 수 있는 페이지이다. password를 입력하는 폼을 확인할 수 있다. view-source를 클릭하여 코드를 확인해본다. 사용자의 입력값을 POST 메소드로 받아서 입력값을 $password와 strcmp()함수로 비교한다. strcmp()의 결과가 0이면 FLAG를 출력한다. $password는 랜덤으로 생성하고 암호화하므로 그 값을 알아낼 수 없다. 문제에서도 말하고 있는 것처럼 strcmp 함수를 우회하는 방법으로 풀어야 한다. php strcmp bypass를 검색해서 strcmp()는 배열과 문자열을 비교하면 0을 반환하는 것을 알게 되었다. Burp Suite를 실행해서 브라우저를 열고 password 값을 전달하는 패킷을 intercept했다. passw..
[드림핵 워게임] [wargame.kr] type confusion 문제 사이트에 접속하면 처음으로 뜨는 페이지이다. 이것만 보고는 아무것도 알 수 없으므로 view-source를 클릭해서 코드를 확인해본다. POST 요청으로 받은 'json' 입력값에 들어있는 key의 value를 gen_key() 함수로 생성한 $key 값과 비교해서 같으면 flag를 출력한다. 이때 gen_key()로 생성한 $key값은 uniqid() 함수와 sha1() 함수를 거쳐 만들어지는데 마이크로초 단위의 현재시간으로 생성(uniqid())되고 암호화(sha1())되므로 그 값을 알아낼 수 없다. 그런데 json 입력값에 들어있는 key의 value와 $key 값을 비교하는 연산자가 == 인 점에 주목할 필요가 있다. ==은 느슨한 비교로, 위의 표를 보면 한 쪽 인자가 비어있지 않은 문자..
[드림핵 워게임] [wargame.kr] login filtering 문제 사이트에 접속하면 처음으로 보이는 페이지이다. get source를 클릭해서 코드를 확인한다. 쿼리문을 실행하는 php 코드를 확인할 수 있다. 사용자의 입력값이 select 문에 들어가서 실행된다. select 문만 보면 sql injection을 시도해보고 싶지만 사용자의 입력값이 mysqli_real_escape_string()함수를 통해 가공되기 때문에 단순한 sql injection은 먹히지 않을 것이다. FLAG가 출력되는 조건을 확인해보면 select 문 결과 조회된 계정이 존재하야 하고 $id가 guest 혹은 blueh4g이 아니어야 한다. 소스코드에 위와 같이 guest와 blueh4g 두 개의 계정 정보가 제공되고 있다. guest계정으로 로그인을 해본다. 역시 your acco..