Stage 1
GET
메소드로 get
이라는 변수에 hehe
를 전달하면 다음으로 이동할 수 있다.
# stage 1
url = 'https://webhacking.kr/challenge/bonus-6/'
res = requests.get(url + '?get=hehe', cookies=cookies)
$ python3 solve.py
<hr>
Challenge 33-1<br>
<a href=index.txt>view-source</a>
<hr>
<a href=lv2.php>Next</a>
Stage 2
POST
메소드로 post
변수에 hehe
를, post2
변수에 hehe2
를 전달하면 다음으로 이동할 수 있다.
# stage 2
url += 'lv2.php'
data = {'post': 'hehe', 'post2': 'hehe2'}
res = requests.post(url, cookies=cookies, data=data)
print(res.text)
$ python3 solve.py
<hr>
Challenge 33-2<br>
<a href=lv2.txt>view-source</a>
<hr>
<a href=33.php>Next</a>
Stage 3
GET
메소드로 myip
변수에 내 IP 주소를 전달하면 다음으로 이동할 수 있다.
# stage 3
myip = '### REDACTED ###' # my IP address
res = requests.get(url + f'33.php?myip={myip}', cookies=cookies)
print(res.text)
$ python3 solve.py
<hr>
Challenge 33-3<br>
<a href=33.txt>view-source</a>
<hr>
<a href=l4.php>Next</a>
Stage 4
GET
메소드로 password
변수에 현재 시각(유닉스 타임스탬프)의 MD5 해쉬 값을 전달하면 다음으로 이동할 수 있다. 서버와 약간의 시간 차이가 있을 수 있기 때문에 힌트로 서버의 현재 시각을 알려준다.
# stage 4
res = requests.get(url + 'l4.php', cookies=cookies)
cur_time = int(res.text.split('hint : ')[1]) # current time
password = hashlib.md5(str(cur_time).encode()).hexdigest()
res = requests.get(url + f'l4.php?password={password}')
print(res.text)
요청이 오고가는 데에 걸리는 시간 때문에 실패할 때도 있다. 여러 번 시도하면 된다.
$ python3 solve.py
<hr>
Challenge 33-4<br>
<a href=l4.txt>view-source</a>
<hr>
<a href=md555.php>Next</a>
Stage 5
GET
변수 imget
, POST
변수 impost
와 imcookie
라는 이름의 쿠키가 설정되어 있으면 다음으로 이동할 수 있다. 요청을 GET
메소드로 보낼 경우 HTTP body의 데이터는 무시되기 때문에, GET
변수를 URL에 포함시켜서 POST
메소드로 요청을 보내야 한다.
# stage 5
data['impost'] = 'AAAA'
cookies['imcookie'] = 'BBBB'
res = requests.post(url + 'md555.php?imget=CCCC', cookies=cookies, data=data)
print(res.text)
$ python3 solve.py
<hr>
Challenge 33-5<br>
<a href=md555.txt>view-source</a>
<hr>
<a href=gpcc.php>Next</a>
Stage 6
test
쿠키에 내 IP 주소의 MD5 해쉬 값을 넣고, POST
메소드로 kk
변수에 user agent의 MD5 해쉬 값을 전달하면 다음으로 이동할 수 있다. User agent는 힌트로 알려준다.
# stage 6
res = requests.get(url + 'gpcc.php', cookies=cookies)
user_agent = res.text.split('hint : ')[1].split('\n')[0] # user agent
cookies['test'] = hashlib.md5(myip.encode()).hexdigest()
data['kk'] = hashlib.md5(user_agent.encode()).hexdigest()
res = requests.post(url + 'gpcc.php', cookies=cookies, data=data)
print(res.text)
$ python3 solve.py
<hr>
Challenge 33-6<br>
<a href=gpcc.txt>view-source</a>
<hr>
<a href=wtff.php>Next</a>
Stage 7
GET
변수의 이름과 값이 모두 내 IP 주소에서 .
들을 뺀 문자열이면 다음으로 이동할 수 있다.
# stage 7
res = requests.get(url + f'wtff.php?{myip.replace(".", "")}={myip.replace(".", "")}', cookies=cookies)
print(res.text)
$ python3 solve.py
<hr>
Challenge 33-7<br>
<a href=wtff.txt>view-source</a>
<hr>
<a href=ipt.php>Next</a>
Stage 8
GET
변수들을 extract()
로 개별적인 변수들로 만든다. addr
이라는 이름의 GET
변수가 있으면 그 값을 가지는 $addr
변수가 생성된다. 따라서 GET
메소드로 addr
변수에 127.0.0.1
을 전달하면 다음으로 이동할 수 있다.
# stage 8
res = requests.get(url + f'ipt.php?addr=127.0.0.1', cookies=cookies)
print(res.text)
$ python3 solve.py
<hr>
Challenge 33-8<br>
<a href=ipt.txt>view-source</a>
<hr>
<a href=nextt.php>Next</a>
Stage 9
$answer
는 97(a
)부터 122(z
)까지 홀수에 해당하는 알파벳들만 이어붙인 문자열이 된다. GET
변수 ans
의 값이 $answer
과 같으면 다음으로 이동할 수 있다.
# stage 9
answer = ''
for i in range(97, 122, 2):
answer += chr(i)
res = requests.get(url + f'nextt.php?ans={answer}', cookies=cookies)
print(res.text)
$ python3 solve.py
<hr>
Challenge 33-9<br>
<a href=nextt.txt>view-source</a>
<hr>
<a href=forfor.php>Next</a>
Stage 10
파이썬으로 옮기기 귀찮아서 그냥 코드를 그대로 옮겨서 $answer
를 계산했다.
<?php
$ip = '### REDACTED ###';
for($i=0;$i<=strlen($ip);$i++) $ip=str_replace($i,ord($i),$ip);
$ip=str_replace(".","",$ip);
$ip=substr($ip,0,10);
$answer = $ip*2;
$answer = $ip/2;
$answer = str_replace(".","",$answer);
echo "answerip/{$answer}_{$ip}.php";
?>
위의 PHP 코드의 실행 결과로 출력되는 주소로 접속하면 문제가 풀린다.