webhacking.kr 33번
33번에 들어가게 되면 바로 소스코드를 확인할 수 있습니다.
<hr>
Challenge 33-1<br>
<a href=index.txt>view-source</a>
<hr>
<?php
if($_GET['get']=="hehe") echo "<a href=???>Next</a>";
else echo("Wrong");
?>
소스코드를 확인해보면 get이라는 인자에 hehe라는 값을 get 방식으로 전달하면 다른 부분으로 이동하는 것 같습니다. 일단 넣어보겠습니다.
인자로 넣어주면 일단 Wrong이 Next로 바뀌었습니다. 다음으로 넘어가보겠습니다.
다시 소스코드를 확인해보아야 할 것 같습니다.
<hr>
Challenge 33-2<br>
<a href=lv2.txt>view-source</a>
<hr>
<?php
if($_POST['post']=="hehe" && $_POST['post2']=="hehe2") echo "<a href=???>Next</a>";
else echo "Wrong";
?>
이번에 post방식으로 전달하는 인자의 값을 소스코드의 조건처럼 맞춰주어야 할 것 같습니다. Post방식의 인자는 burp suite를 이용해 넘겨주겠습니다.
해당 사이트를 burp suite로 잡은 화면인데 사이트가 get방식으로 설정되어 있어서 처음 부분을 수정하고 인자를 전달하면 될 줄 알았는데 실패했습니다. 그래서 구글링을 좀 해보니 친절하게 설명이 되어 있는 블로그 글을 발견했고, 링크를 남깁니다. 아래의 링크를 참고하면 자세히 설명되어 있습니다.
Browser에서 POST 방식 전송
Browser에서 POST 방식 전송 webhacking.kr 33번 문제를 풀다 보면 post방식 전송을 사용해야 될 때가 있다. (webhacking.kr 33번 문제의 일부 해답이 되어있음) burp suite를 사용하여 문제를 해결했지만 다른 to..
dongdd.tistory.com
이 부분이 response 헤더 파일일고 get방식으로 설정되어 있는 것을 알 수 있습니다.
링크를 참고하여 post방식으로 인자를 전달하였습니다.
이렇게 console에 추가한 후 network로 가면
lv2.php가 하나 더 생기는 것을 볼 수 있고 새로 추가된 lv2.php의 헤더와 response를 보면
이렇게 알 수 있습니다. 여기서 살짝 삽질을 한게 전 새로고침을 하면 바로 넘어가는 줄 알았는데 그것이 아니라 response의 결과의 33.php로 직접 이동해야 다음 문제의 페이지로 넘어갈 수 있었습니다.
이번에도 같습니다. 바로 소스코드 확인하겠습니다.
<hr>
Challenge 33-3<br>
<a href=33.txt>view-source</a>
<hr>
<?php
if($_GET['myip'] == $_SERVER['REMOTE_ADDR']) echo "<a href=???>Next</a>";
else echo "Wrong";
?>
myip라는 인자의 값이 현재 저의 ip와 같아야 하는 것 같습니다. 그렇다면 ip를 확인해보겠습니다.
IP 주소 정보
위치, 날씨, 클라이언트 등록 및 더 많은 : IP 주소 및 브라우저에 대한 정보. 고급 인터넷 도구.
ko.infobyip.com
ip 주소는 이 사이트를 이용해서 얻었습니다.
이렇게 전달하면
다음으로 넘어갈 수 있습니다.
바로 소스코드 보겠습니다.
<hr>
Challenge 33-4<br>
<a href=l4.txt>view-source</a>
<hr>
<?php
if($_GET['password'] == md5(time())) echo "<a href=???>Next</a>";
else echo "hint : ".time();
?>
password의 값이 time()함수의 값의 md5 암호화한 값이어야 하는 것 같습니다. 그리고 time함수의 값을 힌트로 출력해주기 때문에 이 값을 암호화해서 전달해 보겠습니다.
www.md5online.org/md5-encrypt.html
MD5 Online | Free and fast MD5 encryption
www.md5online.org
아래의 링크를 이용해서 암호화해주었습니다.
이렇게 보내면 될 줄 알았는데 안 되네요... 아마 time함수로 실시간으로 초단위계산되는 것 같습니다. 그렇다면 파이썬 코드를 이용해서 전달을 해주어야 할 것 같습니다. 이것 역시 결과를 받아서 출력한 후에 다음 페이지의 소스코드 이름을 확인해야 할 듯 합니다.
사용한 파이썬 코드와 결과값입니다.
import requests
import time
import hashlib
url='https://webhacking.kr/challenge/bonus-6/l4.php?'
header={'Cookie':'PHPSESSID=kumrcrat0ij53lt23vrho3j3vh'}
t=int(time.time())
t=hashlib.md5(str(t)).hexdigest()
query='password={}'.format(t)
result = requests.get(url+query, headers = header)
print(result.text)
결과를 확인해보니 다음 페이지는 md555.php입니다.
바로 소스코드 확인하겠습니다.
<hr>
Challenge 33-5<br>
<a href=md555.txt>view-source</a>
<hr>
<?php
if($_GET['imget'] && $_POST['impost'] && $_COOKIE['imcookie']) echo "<a href=???>Next</a>";
else echo "Wrong";
?>
역시 주어진 조건 을 만족해야 합니다. 조건들이 계속 쉽기 때문에 앞으로 큰 변경점이 없을경우 조건에 대한 설명은 생략하겠습니다.
이번에도 파이썬 코드를 이용했습니다.
import requests
url='https://webhacking.kr/challenge/bonus-6/md555.php?imget=1'
data={'impost':'1'}
cookie={'imcookie':'1'}
result = requests.post(url, data=data, cookies = cookie)
print(result.text)
다음 페이지는 gpcc.php인것 같습니다.
<hr>
Challenge 33-6<br>
<a href=gpcc.txt>view-source</a>
<hr>
<?php
if($_COOKIE['test'] == md5($_SERVER['REMOTE_ADDR']) && $_POST['kk'] == md5($_SERVER['HTTP_USER_AGENT'])) echo "<a href=???>Next</a>";
else echo "hint : {$_SERVER['HTTP_USER_AGENT']}";
?>
6번째 단계입니다. 이 부분도 아마 파이썬 코드를 이용하면 될 것 같습니다.
import requests
import hashlib
url='https://webhacking.kr/challenge/bonus-6/gpcc.php'
ip='180.224.43.160'
ip=hashlib.md5(str(ip)).hexdigest()
agent='Mozilla/5.0 (Macintosh; Intel Mac OS X 11_3_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.192 Safari/537.36'
agent=hashlib.md5(str(agent)).hexdigest()
data={'kk':agent}
cookie={'test':ip}
result = requests.post(url, data=data, cookies = cookie)
print(result.text)
이 코드로 인자를 전달했는데
이런 결과를 보고 당황했는데 찾아보니 agent의 값을 파이썬 코드를 사용했을 경우에는 파이썬 결과로 바꿔주어야 한다고 합니다.
수정해 주었더니 제대로된 결과가 나왔습니다.(수정은 직접 해보는 것도 좋을 거 같습니다.)
다음 페이지로 이동 후 소스코들 보겠습니다.
<hr>
Challenge 33-7<br>
<a href=wtff.txt>view-source</a>
<hr>
<?php
$_SERVER['REMOTE_ADDR'] = str_replace(".","",$_SERVER['REMOTE_ADDR']);
if($_GET[$_SERVER['REMOTE_ADDR']] == $_SERVER['REMOTE_ADDR']) echo "<a href=???>Next</a>";
else echo "Wrong<br>".$_GET[$_SERVER['REMOTE_ADDR']];
?>
str replace함수를 통해 문자를 바꿔주는 것 같습니다. 소스코드를 보면 ip에서 .을 그냥 없애주는 것 같습니다. 그래서 위에서 소개한 사이트에서 자신의 ip를 확인한 뒤 .을 뺀 값을 인자와 데이터로 넣어주면 될 것 같습니다.
ex) 127.0.0.1일 경우 127001=127001
<hr>
Challenge 33-8<br>
<a href=ipt.txt>view-source</a>
<hr>
<?php
extract($_GET);
if(!$_GET['addr']) $addr = $_SERVER['REMOTE_ADDR'];
if($addr == "127.0.0.1") echo "<a href=???>Next</a>";
else echo "Wrong";
?>
이 정도 소스 코드는 충분히 해석할 수 있을 거라고 생각합니다. 순간 헷갈릴 수 있지만 결국 addr값을 127.0.0.1로 전달하라는 뜻입니다.
<hr>
Challenge 33-9<br>
<a href=nextt.txt>view-source</a>
<hr>
<?php
for($i=97;$i<=122;$i=$i+2){
$answer.=chr($i);
}
if($_GET['ans'] == $answer) echo "<a href=???.php>Next</a>";
else echo "Wrong";
?>
이 부분도 같습니다. for문의 결과값으로 나오는 문자열을 ans로 전달하면 되는데 이 결과값은 파이썬 코드를 이용해 찾아서 넘겨주었습니다.
ch=''
for i in range(97,123,2):
ch+=chr(i);
print(ch)
<hr>
Challenge 33-10<br>
<a href=forfor.txt>view-source</a>
<hr>
<?php
$ip = $_SERVER['REMOTE_ADDR'];
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);
$f=fopen("answerip/{$answer}_{$ip}.php","w");
fwrite($f,"<?php include \"../../../config.php\"; solve(33); unlink(__FILE__); ?>");
fclose($f);
?>
solve가 있는 것 보니 드디어 마지막 단계인 것 같습니다. (이게 어려운 문제는 아닌데... 너무 단계가 많습니다...)
소스코드를 보면 현재 저의 ip를 가져와서 문자열 변환과 계산등을 수행하는데 이 소스코드는 php이기 때문에 그냥 가져와서 붙여넣은 다음 결과값을 echo로 출력하면 됩니다. 아마 이 문제를 푸는 분들이라면 로컬 서버는 가지고 있을 것이기 때문에 자신의 로컬서버에 파일을 만들어서 웹페이지로 출력해보면 됩니다.
<?php
$ip='자신의 ip';
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);
print($answer);
echo "answerip/{$answer}_{$ip}.php";
?>
위의 코드에 자신의 ip코드를 넣어서 결과값을 확인 한뒤 아래의 링크처럼 보내주면 문제가 드디어 풀립니다,
결과값을 이용해 위 링크처럼 url을 입력하면 문제가 풀립니다.