[Webhacking.kr] 33번
다음 문제~
Challenge 33-1
/challenge/bonus/bonus-6/index.phps
Wrong
이 문제다. index.phps를 봐주자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <hr> Challenge 33-1<br> <script>document.write("<a href=http://webhacking.kr<?=$_SERVER[PHP_SELF]?>s><?=$_SERVER[PHP_SELF]?>s</a>");</script> <hr> <? if($_GET[get]=="hehe") { echo("<a href=###>Next</a>"); } else { echo("Wrong"); } ?> | cs |
위와 같다.
Challenge 33-1 밑으로 이문제의 소스를 보여주는 페이지인 index.phps에 대한 링크가 있다.
이 문제 33은 GET방식으로 get을 받아 get==hehe이면 Next를 출력하고 아니라면 Wrong을 출력한다.
index.php?get=hehe를 url에 입력했다.
( http://webhacking.kr/challenge/bonus/bonus-6/index.php?get=hehe )
Wrong 대신 Next가 나왔다.
클릭하자 Challenge 33-2로 이동하였다.
마찬가지로 소스가 주어진다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <hr> Challenge 33-2<br> <script>document.write("<a href=http://webhacking.kr<?=$_SERVER[PHP_SELF]?>s><?=$_SERVER[PHP_SELF]?>s</a>");</script> <hr> <? if($_POST[post]=="hehe" && $_POST[post2]=="hehe2") { echo("<a href=##>Next</a>"); } else { echo("Wrong"); } ?> | cs |
이번엔 POST방식으로 post=hehe와 post2=hehe2로 받으면 다음으로 가는 링크를 보여준다.
이건 좀 복잡하다. form을 만들어서 POST방식으로 전송해야할것 같다.(또는 javascript이용)
크롬 개발자도구(F12)를 이용하여 Edit as HTML을 하여 POST방식 전송을 위한 form을 만들어주면 된다.
1 2 3 4 5 | <form method="post" action="lv2.php"> POST <input type="text" name="post"> POST2 <input type="text" name="post2"> <input type="submit" value="Submit"> </form> | cs |
위와 같이 넣어주자.
그럼 POST와 POST2에 대한 입력창이 생기므로 여기에 hehe와 hehe2를 넣어 제출하면 된다.
Challenge 33-3이다.
다음은 아래와 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <hr> Challenge 33-3<br> <script>document.write("<a href=http://webhacking.kr<?=$_SERVER[PHP_SELF]?>s><?=$_SERVER[PHP_SELF]?>s</a>");</script> <hr> <? if($_GET[myip]==$_SERVER[REMOTE_ADDR]) { echo("<a href=##.php>Next</a>"); } else { echo("Wrong"); } ?> | cs |
자신의 아이피를 get방식으로 보내면 될것같다.
Webhacking.kr 홈페이지 Challenges 메인창에서 IP를 볼 수 있으니 참고하자.
http://webhacking.kr/challenge/bonus/bonus-6/33.php?myip=100.000.000.000
Challenge 33-4
hint : 156346965
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <hr> Challenge 33-4<br> <script>document.write("<a href=http://webhacking.kr<?=$_SERVER[PHP_SELF]?>s><?=$_SERVER[PHP_SELF]?>s</a>");</script> <hr> <? if($_GET[password]==md5(time())) { echo("<a href=###>Next</a>"); } else { echo("hint : ".time()); } ?> | cs |
hint로 time()이 출력되고 있고 get방식으로 md5(time())을 입력해주어야한다.
F5를 계속 눌러보면 알겠지만 hint에 있는 저 숫자가 계속 올라감을 알 수 있다.
적당히 md5로 인코딩해서 F5를 계속 눌러주면 될 것같다.
md5 인코딩 : http://md5encryption.com/
http://www.mimul.com/examples/dencoder/
(찾고나니 알았는데 IP랑 똑같이 Challenge 메인에서 변환할수 있다.)
적당히 time()에서 +40해서 md5인코딩해서 F5를 눌러서 성공
Challenge 33-5
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <hr> Challenge 33-5<br> <script>document.write("<a href=http://webhacking.kr<?=$_SERVER[PHP_SELF]?>s><?=$_SERVER[PHP_SELF]?>s</a>");</script> <hr> <? if($_GET[imget] && $_POST[impost] && $_COOKIE[imcookie]) { echo("<a href=###>Next</a>"); } else { echo("Wrong"); } ?> | cs |
get방식과 post방식과 쿠키의 3콤보!
z쿠키는 크롬확장프로그램 EditThisCookie를 이용했다. (또는 크롬개발자도쿠를 이용해도 된다.)
쿠키생성후 아까전과 같이 form으로 POST 입력창을 만들고 get은 url에 입력해서 보내자.
GET :
http://webhacking.kr/challenge/bonus/bonus-6/md555.php?imget=123
POST:
1 2 3 4 5 | <form method="post" action="md555.php?imget=123"> POST <input type="text" name="impost"> <input type="submit" value="Submit"> </form> | cs |
Cookie :
imcookie 이름으로 아무거나 생성
크롬개발자도구(F12) Console:
document.cookie="imcookie=1";
document.write('<form method="post" action="md555.php?imget=1"><input type="text" name="impost" value="1"><input type="submit"></form>');
Challenge 33-6
hint : Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <hr> Challenge 33-6<br> <script>document.write("<a href=http://webhacking.kr<?=$_SERVER[PHP_SELF]?>s><?=$_SERVER[PHP_SELF]?>s</a>");</script> <hr> <? 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]"); } ?> | cs |
쿠키값 test==md5(SERVER[REMOTE_ADDR]) 와 post방식으로 kk==md5(SERVER[HTTP_USER_AGENT])을 넣어주면 될것 같다.
간단하다. REMOTE_ADDR을 md5로 인코딩한 값은 Webhacking.kr 홈페이지 Challenges 메인창에서 해결하고
kk에 넣을 값은 hint에서 디폴트로 출력하고 있다. 저 값을 md5로 인코딩해서 post로 보내자.
document.cookie="test=~";
document.write('<form method="post" action="gpcc.php"><input type="text" name="kk" value="e8aa320ddb6983ade426fcffe3af7f1f"><input type="submit"></form>');
Challenge 33-7
아직도 끝나지 않았다!!??
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <hr> Challenge 33-7<br> <script>document.write("<a href=http://webhacking.kr<?=$_SERVER[PHP_SELF]?>s><?=$_SERVER[PHP_SELF]?>s</a>");</script> <hr> <? $_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]]); } ?> | cs |
보는 대로다. 내 아이피에서 "."을 뺀값을 GET으로 보내주자.
Challenge 33-8
이젠 놀랍지도 않다. 끝은 대체 어디인가;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <hr> Challenge 33-8<br> <script>document.write("<a href=http://webhacking.kr<?=$_SERVER[PHP_SELF]?>s><?=$_SERVER[PHP_SELF]?>s</a>");</script> <hr> <? extract($_GET); if(!$_GET[addr]) $addr=$_SERVER[REMOTE_ADDR]; if($addr=="127.0.0.1") { echo("<a href=###>Next</a>"); } else { echo("Wrong"); } ?> | cs |
extract는 GET으로 받은 것들을 전부 변수로 변환해주는 역할을 한다. 예전에 어떤 문제풀면서 설명했었다. 그 설명을 가져오면...
extract() 함수는 배열 속의 키값을 변수화 시켜주는 함수이다. (http://php.net/manual/kr/function.extract.php)
extract(array) : array의 key값의 이름으로 변수를 만듬. 변수의 값은 key값에 대응하는 값. ex) extract($_GET) => $addr= $_GET['addr']
그러므로 addr=127.0.0.1을 전송해주면 된다.
Challenge 33-9
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <hr> Challenge 33-9<br> <script>document.write("<a href=http://webhacking.kr<?=$_SERVER[PHP_SELF]?>s><?=$_SERVER[PHP_SELF]?>s</a>");</script> <hr> <? for($i=97;$i<=122;$i=$i+2) { $ch=chr($i); $answer.=$ch; } if($_GET[ans]==$answer) { echo("<a href=###>Next</a>"); } else { echo("Wrong"); } ?> | cs |
for문을 분석해보면 i=97~i=122까지의 값을 문자열로 변환해 $answer에 붙이고 있다.(chr은 int형을 char형으로 변환)
php문으로 돌려보든 c언어로 돌려보든... 암튼 해보면
acegikmoqsuwy 가 나온다.
http://webhacking.kr/challenge/bonus/bonus-6/nextt.php?ans=acegikmoqsuwy
Challenge 33-10
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | <hr> Challenge 33-10<br> <script>document.write("<a href=http://webhacking.kr<?=$_SERVER[PHP_SELF]?>s><?=$_SERVER[PHP_SELF]?>s</a>");</script> <hr> <? $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); @mkdir("answerip/$ip"); $answer=$ip*2; $answer=$ip/2; $answer=str_replace(".","",$answer); $pw="###"; $f=fopen("answerip/$ip/$answer.$ip","w"); fwrite($f,"Password is $pw\n\nclear ip : $_SERVER[REMOTE_ADDR]"); fclose($f); ?> | cs |
정말로 끝이 있는지 모르겠다.
천천히 분석해 보겠다.
$ip 값을 설정하고 for문을 이용해 ip의 문자열값을 전부 아스키값으로 변환하면서 $ip에 다시 저장한다.
이건 돌려보는게 편하다. 저 php문 그대로 돌려보자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <?php $ip="106.246.238.179"; 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 "ip : ".$ip."\n"; echo "answer : ".$answer."\n"; ?> | cs |
이렇게 돌려보겠다. (참고로 풀고나서 알았는데 http://webhacking.kr/pds/phppad/index.php 여기서 php코드를 돌려볼수있다.)
ip : 5510755106
answer : 2755377553
결과다.
원래 소스를 보면 answerip/$ip라는 폴더를 만든다.
즉 answerip/5510755106 라는 폴더가 만들어졌다.
그리고 $pw 값을 answerip/$ip/$answer.$ip 에 쓰고있다.
answerip/5510755106/2755377553.5510755106 라는 파일에 답이 있을것이다.
Password is 13d5c1db6d12892baa9ca3e288d4b5dd clear ip : ************
굿.... 이제 끝난것 같다.
여담으로... Auth에 들어갔더니 Wrong ip!! 5510755106라고 떳다. .... 문제풀면서 ip가 변조됫어 ㅂㄷㅂㄷ;