[Webhacking.kr] 33번

2017. 9. 21. 23:55

다음 문제~



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가 변조됫어 ㅂㄷㅂㄷ;



'Wargame > 웹해킹(Webhacking.kr)' 카테고리의 다른 글

[Webhacking.kr] 39번  (0) 2017.09.28
[Webhacking.kr] 38번  (0) 2017.09.25
[Webhacking.kr] 32번  (0) 2017.09.18
[Webhacking.kr] 27번  (0) 2017.09.06
[Webhacking.kr] 26번  (0) 2017.09.06

+ Recent posts