https://webhacking.kr/challenge/bonus-6/
[문제]
[풀이]
[Challenge 33-1]
소스코드를 본다.
<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방식으로 get을 받고 get이 hehe라면 Next를 출력하는 코드이다.
Next가 하이퍼링크 걸린다.
아마 old-33문제는 부분문제들인 것 같다.
[Challenge 33-2]
<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";
?>
33-2번 문제의 소스코드이다.
POST방식으로 post는 hehe, post2는 hehe2로 입력받으면 다음문제로 넘어간다.
burp suite를 이용해서 패킷을 변조 후 전송한다.
[Challenge 33-3]
<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";
?>
GET방식으로 myip가 Client IP와 같으면 다음 문제로 넘어간다.
공인 아이피 주소를 복사해주고
다음 문제로 넘어간다.
[Challenge 33-4]
<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();
?>
힌트는 1970년 1월 1일 오전 12시부터 현재까지를 ticks 단위로 나타낸 것이다.
현재 시간(ticks단위)를 md5로 암호화 하면 된다.
import requests
from time import time
import math
import hashlib
timeaa = math.ceil(time()) #ticks 단위의 소숫점을 버리는 코드
result = hashlib.md5(str(timeaa).encode('utf-8')).hexdigest() #md5로 암호화
url = 'https://webhacking.kr/challenge/bonus-6/l4.php'
url = url + '?password=' + result
res = requests.get(url).text
print(res)
간단하게 python 코드를 짰다.
다음 문제의 경로를 확인할 수 있다. 다음 문제로 넘어간다.
[Challenge 33-5]
<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";
?>
GET방식으로 imget을 POST방식으로 impost, imcookie 이름의 쿠키를 전송하면 다음 문제로 넘어간다.
POST로 보내지만 URL에 GET방식과 똑같이 보낼 수 있다.
[Challenge 33-6]
<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']}";
?>
test쿠키의 값이 md5로 암호화된 Client IP이고,
POST방식의 kk변수가 md5로 암호화된 Client USER_AGENT라면 다음 문제로 넘어간다.
쿠키랑 POST방식 kk를 보내주면 된다.
[Challenge 33-7]
<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']];
?>
Client IP에서 .을 필터링해서 공백으로 변환한다.
변한한 Client IP를 이름으로 한 변수의 값이 Client IP라면 다음 문제로 넘어간다.
위처럼 공인아이피에서 .을 지워주면 된다.
[Challenge 33-8]
<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";
?>
extract 함수는 $_GET 안에있는 addr키값을 변수화 시킨다.
그러므로 addr의 키값을 127.0.0.1로 저장 하면 다음 문제로 넘어간다.
[Challenge 33-9]
<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값으로 입력 하면 다음 문제로 이동한다.
[Challenge 33-10]
<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);
?>
해석을 돌린다 예로 127.0.0.1 로컬호스트로 보여주겠다.
제출하면 old-33 문제가 풀린다.