kangsecu's B1og

[webhacking.kr] pro 6번 문제풀이 본문

Web Hacking/webhakcing.kr

[webhacking.kr] pro 6번 문제풀이

Kangsecu 2018. 1. 22. 00:39


webhacking.kr에  pro6번 문제를 풀어보도록 하겠습니다.

우선 문제를 눌러서 들어가 보겠습니다.

이러한 화면이 출력됩니다. HINT : base64라고 하네요.  그리고 ID와 PW값을 주어서 'sql injection이겠구나' 하고 생각을 하고 있었습니다. 그럼 이제 index.phps를 들어가 문제 코드를 확인해보도록 하겠습니다. 

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
<?php 
if(!$_COOKIE[user]) 
    $val_id="guest"
    $val_pw="123qwe"
 
    for($i=0;$i<20;$i++
    { 
        $val_id=base64_encode($val_id); 
        $val_pw=base64_encode($val_pw); 
 
    } 
 
    $val_id=str_replace("1","!",$val_id); 
    $val_id=str_replace("2","@",$val_id); 
    $val_id=str_replace("3","$",$val_id); 
    $val_id=str_replace("4","^",$val_id); 
    $val_id=str_replace("5","&",$val_id); 
    $val_id=str_replace("6","*",$val_id); 
    $val_id=str_replace("7","(",$val_id); 
    $val_id=str_replace("8",")",$val_id); 
 
    $val_pw=str_replace("1","!",$val_pw); 
    $val_pw=str_replace("2","@",$val_pw); 
    $val_pw=str_replace("3","$",$val_pw); 
    $val_pw=str_replace("4","^",$val_pw); 
    $val_pw=str_replace("5","&",$val_pw); 
    $val_pw=str_replace("6","*",$val_pw); 
    $val_pw=str_replace("7","(",$val_pw); 
    $val_pw=str_replace("8",")",$val_pw); 
 
    Setcookie("user",$val_id); 
    Setcookie("password",$val_pw); 
 
    echo("<meta http-equiv=refresh content=0>"); 
?> 
 
<html
<head
<title>Challenge 6</title
<style type="text/css"> 
body { background:black; color:white; font-size:10pt; 
</style
</head
<body
 
<? 
 
$decode_id=$_COOKIE[user]; 
$decode_pw=$_COOKIE[password]; 
 
$decode_id=str_replace("!","1",$decode_id); 
$decode_id=str_replace("@","2",$decode_id); 
$decode_id=str_replace("$","3",$decode_id); 
$decode_id=str_replace("^","4",$decode_id); 
$decode_id=str_replace("&","5",$decode_id); 
$decode_id=str_replace("*","6",$decode_id); 
$decode_id=str_replace("(","7",$decode_id); 
$decode_id=str_replace(")","8",$decode_id); 
 
$decode_pw=str_replace("!","1",$decode_pw); 
$decode_pw=str_replace("@","2",$decode_pw); 
$decode_pw=str_replace("$","3",$decode_pw); 
$decode_pw=str_replace("^","4",$decode_pw); 
$decode_pw=str_replace("&","5",$decode_pw); 
$decode_pw=str_replace("*","6",$decode_pw); 
$decode_pw=str_replace("(","7",$decode_pw); 
$decode_pw=str_replace(")","8",$decode_pw); 
 
 
for($i=0;$i<20;$i++
    $decode_id=base64_decode($decode_id); 
    $decode_pw=base64_decode($decode_pw); 
 
echo("<font style=background:silver;color:black>&nbsp;&nbsp;HINT : base64&nbsp;&nbsp;</font><hr><a href=index.phps style=color:yellow;>index.phps</a><br><br>"); 
echo("ID : $decode_id<br>PW : $decode_pw<hr>"); 
 
if($decode_id=="admin" && $decode_pw=="admin"
    @solve(6,100); 
 
 
?> 
 
</body
</html
cs

이렇게 문제 코드가 있습니다. 코드를 해석해보니 처음에 COOKIE에 ID값을 guest로 할당해주고, PW값을 123qwe로 할당을 해줍니다. 그 후, for문을 이용한 반복문에서 decoding을 20번 해준다는것을 알 수 있습니다. 그리고 solve 섹션을 확인하면 ID 와 PW값이 모두 admin이 되어야 문제가 해결되는 것을 알 수 있습니다. 그럼 이제 문제를 밑에서부터 풀어보도록 하겠습니다. 

코드가 두가지 섹션으로 나뉘어져있습니다. 한 섹션은 base64 encode부분이 있으며, 다른 부분은 base64 decode부분이 있습니다. 

<base64 encoding section>

우선 base64 encoding section을 해석하면 user라는 쿠키값이 존재하지 않는다면 if문을 실행하고 if문 안에서는 위에서 언급한 ID와 PW를 guest와 123qwe로 할당을 해줍니다.  그리고 그  밑에 반복문을 통해 ID값과 PW값을 base64로 20번 encoding하는걸 알 수 있습니다. 그 후, ID값과 PW값을 str_replace를 통하여 치환을 해줍니다. 마지막으로 base64로 20번 인코딩이되고 str_replace로 치환된 값을 다시 해당 변수에 저장을 해줍니다.


<base64 decoding section>

base64 decoding section을 해석하면 위에 encoding section에서 치환한 값을 다시 str_replace를 이용하여 치환해줍니다. 또한, ID 와 PW 값을 반복문을 통해 20번 base64로 decoding하여 다시 변수에 값을 저장합니다.  그 후 각 변수에 저장된 값을 출력한 후, if문을 통하여 ID와 PW 의 값이 admin이면 solve가 됩니다.


<문제 풀이>

이제 직접 문제를 풀어보도록 하겠습니다. 우선 위에 코드를 보아하니 admin이란 값을 20번 인코딩하여서 cookie에 존재하는 ID와 PW에 넣고 그 값이 코드의 과정을 거쳐서 admin이 될 경우에 문제가 해결이됩니다.  아래 사진과 같이 webhacking.kr 에서 제공해주는 en/decoder를 사용하도록 하겠습니다.

이곳에 admin을 적고 base64로 20번을 encoding해줍니다.

그럼 이러한 값이 출력이 됩니다. 이제 이 값을 복사합니다.

이것이 원래 문제에서 세팅 되어있는 쿠키값입니다. 이제 이것을 우리가 구한 값으로 대입을 해주면 됩니다.

이렇게 대입을 한 후 새로고침을 눌러주시면 문제가 해결됩니다.

이상입니다.