문제분석 & 풀이
주어진 코드를 확인해보자.
소스를 보니 GET 방식으로 get 이라는 파라미터를 "hehe" 라는 값으로 전송하면 문제가 해결되는 것 같다.
URL을 통해 값을 전송해보니 Next 라는 하이퍼링크가 뜬다.
Next를 눌러보니 33-2 단계가 나온다.
아마 33번 문제는 여러개의 스테이지로 나눠져있는 것 같다.
소스를 보니 이번에는 POST 방식으로 post, post2 라는 두개의 데이터값을 전송하면 문제가 해결된다.
post 방식으로 값을 전송하기 위해 버프스위트를 이용하여 패킷을 잡아서 POST 방식으로 변경하여 DATA 영역에 값을 넣어서 패킷을 전송했다.
패킷을 전송하니 이번에도 NEXT가 뜬다. 다음문제로 가보자.
33-3번의 소스를 보니 이번에는 myip 라는 파라미터에 PC IP 값을 넣어서 전송하면 문제가 해결된다.
33-3 클리어! 다음문제로 가보자.
33-4 번의 경우 Wrong 이 아닌 hint 가 주어져있다.
소스를 보니 힌트로 주어진 값은 현재시간을 의미하는 값이였다.
문제를 해결하기 위해서는 password 파라미터로 현재시간을 MD5 해싱한 값을 보내야 한다.
그러나 현재시간은 계속 바뀌기 때문에 현재시간을 바로 해싱해서 값을 전송하기 위해서는 python을 이용해야 할 것 같다.
from requests import *
from time import *
from hashlib import *
from math import *
s=session()
password=str(floor(time()))
password=md5(password.encode()).hexdigest()
url=f'https://webhacking.kr/challenge/bonus-6/l4.php?password={password}'
response=get(url=url)
print(response.text)
위와 같이 코드를 짜서 현재시간 값을 바로 md5로 해싱해 값을 전송하고 결과값을 받았다.
결과값을 받아보니 다음 문제의 주소를 알 수 있었고 바로 접속해봤다.
이번 문제는 GET 방식 파라미터 imget , POST 방식 파라미터 impost , 쿠키 imcookie
위 3가지의 값을 모두 보내면 문제가 해결된다.
from requests import *
url=f'https://webhacking.kr/challenge/bonus-6/md555.php?imget=123'
data={'impost':'123'}
cookies={'imcookie':'123'}
response=post(url=url,data=data,cookies=cookies)
print(response.text)
3가지를 모두 보내기위해 python을 이용했다.
값을 전송하고 받아보니 이번에도 다음 문제의 주소가 나왔다.
접속해보자.
다음문제로 접속하니 이번에는 힌트로 에이전트 정보가 주어져있다.
이번에는 test라는 쿠키값에 IP 주소를 MD5 해싱한 값 , kk라는 POST방식의 데이터 값에 에이전트 정보 해싱한 값을 넣어서 전송하면 된다.
from requests import *
from time import *
from hashlib import *
from math import *
s=session()
ip='IP주소'
ip=md5(ip.encode()).hexdigest()
agent='에이전트 정보'
agent=md5(agent.encode()).hexdigest()
url=f'https://webhacking.kr/challenge/bonus-6/gpcc.php'
data={'kk':agent}
cookies={'test':ip}
response=post(url=url,data=data,cookies=cookies)
print(response.text)
이번에도 python을 이용해 각각의 값을 해싱하여 전송했다.
* 주의사항 : 에이전트 정보는 브라우저로 보내는 에이전트 정보랑 python을 이용해 통신하는 에이전트 정보가 서로 다르기 때문에 이를 참고하고 값을 전송해야한다.
다음 문제의 주소를 알아냈다.
접속해보자.
문제에 접속하자마자 소스를 봤고 분석해봤다.
1. ip주소값의 "." 를 모두 "" 으로 치환한다. (2번줄)
2. 치환된 값을 이름으로 하는 파라미터의 값이 치환된 값이면 문제가 해결된다. (3번줄)
분석에서 2번이 무슨말인지 햇갈릴 수 있어 예시를 들어봤다.
ex) 123.123.123.123 이 ip 주소라면 치환된 값은 123123123123 이다.
결론적으로 123123123123=123123123123 이라는 파라미터 값을 URL을 통해 전송하면 된다.
이제 본인의 IP 주소를 이용해 위와 같은 방식으로 치환해서 값을 전송해보자.
값을 전송하니 다음문제로 넘어갈 수 있게 됐다.
넘어가보자.
이번에도 다음 문제를 보자마자 소스부터 봤다.
1. extracct()를 통해 get 파라미터로 전송된 모든 값을 변수로 선언한다. (2번줄)
2. addr 이라는 파라미터가 없으면 $addr 에 IP주소를 넣는다.
3. $addr이 "127.0.0.1" 이면 문제가 해결된다.
결국 $addr값을 "127.0.0.1"로 만들어야 문제가 해결되는데 2번을 보면 $addr 에는 IP 주소가 들어가기 때문에
$addr을 "1270.0.1"로 만들 수가 없다.
그러나 이번 문제에서는 extract()를 사용하고 있고 extract()는 확실한 취약점이 존재하는 함수이다.
분석 1번에도 언급했듯이 모든 get 파라미터를 변수로 선언한다.
따라서 파라미터를 이용해 addr값을 "127.0.0.1"로 전송하면 $addr="127.0.0.1"이 선언되고
이때, $addr 값은 존재하기 때문에 소스의 3번줄을 거치지 않게 되고 4번줄에서 if문이 참이되서 문제가 해결될 것이다!
값을 전송하니 문제가 해결됐다.
다음 문제로 넘어가자.
이번 문제는 아스키코드 기준 97~122까지 중 홀수값에 해당되는 문자를 모두 $answer 변수에 차례대로 값을 저장하고 그 값과 ans라는 파라미터 값이 같으면 문제가 해결된다.
ans 파라미터에 들어갈 값을 구하기위해 python을 이용했다.
from requests import *
s=session()
answer=''
for i in range(97,123,2):
answer+=chr(i)
url=f'https://webhacking.kr/challenge/bonus-6/nextt.php?ans={answer}'
response=get(url=url)
print(response.text)
값을 전송하니 이번에도 다음 문제의 주소가 나왔다.
접속해보자.
33-10번 문제 접속 후 바로 소스부터 확인했다.
소스를 분석해보자.
1. $ip에 IP주소를 넣는다.
2. IP주소 길이만큼의 횟수만큼 루프를 돌아서 각 루프마다 $i값에 해당되는 값이 있으면 ord($i) 값으로 모두 치환한다. (3번줄)
3. $ip의 "." 를 "" 로 모두 치환하고 $ip를 앞에서부터 10자리만큼 자른다.
4. $ip*2 를 $answer에 저장하고 다시 $ip/2를 $answer에 저장한다.
5. $answer의 "." 를 "" 로 모두 치환한다.
6. answerip/{$answer}_{$ip}.php 경로의 php 파일에 solve(33)이 포함된 소스를 넣는다.
결론적으로 최종 $answer 과 $ip 값을 알아내서 {$answer}_{$ip}.php 파일에 접속하면 문제가 해결된다!
$answer 와 $ip값을 간단하게 알아내기 위해 문제 소스의 일부를 가져와서 변형하여 소스를 만들어서 직접 실행시켜 값을 빠르게 구해봤다.
값을 구했으니 이제 구한 경로로 직접 접속해보자.
클리어!!