Gae Ko's Blog

[webhacking.kr] challenges6 본문

웹해킹 /[webhacking.kr]

[webhacking.kr] challenges6

Gae Ko 2017. 10. 20. 22:00

문제를 보니 


힌트는 base64 라고 한다! 

그리고 ID 는 guest 이고 PW는 123qwe라고 출력되어 있다.

링크로 된 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


[코드분석]

2-36 : if문으로 "user"라는 쿠키값이 비어있는 경우에 아래 해당하는 코드를 실행 

4-5 : 변수 var_id와 var_pw를 선언 및 초기화 

7-12 : for문을 이용해 var_id와 var_pw를 20번 base64 인코딩하기 

14-30 : var_id와 var_pw를 replace( )함수를 이용해 숫자를 해당 특수문자로 대체하기 

32-35 : "user"라는 쿠키값으로 var_id를 "password"라는 쿠키값으로 var_pw를 설정하고 새로고침하기

50-51 : 변수 decode_id는 "user"쿠키값으로 decode_pw는 "password"쿠키값으로 초기화

53-69 : decode_id와 decode_pw를 replace( )함수를 이용해 특수문자를 해당 숫자로 대체하기 

72-76 : for문을 이용해 decode_id와 decode_pw를 20번 디코딩하기 

78-79 : html 코드 

→ 문제페이지에 나오는 ID값과 PW값이 각각 decode_id와 decode_pw에 저장된 값과 동일함을 알 수 있음!

81-84 : if문으로 decode_id와 decode_pw이 모두 "admin"이면 문제가 풀린다.


코드를 보니 index.phps가 실행되서 변수 decode_id와 decode_pw에 맨 마지막으로 저장되는 값이 "guest"와 "123qwe"임을 알 수 있다. 

왜냐하면 코드의 79번째를 보면 마지막으로 값이 변경된 decode_id와 decode_pw가 문제페이지에 출력되게 했기 때문이다.


일단 코드의 맨처음 if문의 조건이 맞나 확인하기 위해 문제페이지의 쿠키값을 확인해보았다.



"user"라는 쿠키값이 존재하므로 if문의 조건에 맞지 않다. 즉 if문 아래의 코드는 무시해도 되겠다.

그 다음 코드를 쉽게 정리하자면 


변수 decode_id와 decode_pw에 저장되는 값은 "user"쿠키값과 "password"쿠키값 

→ 특수문자를 숫자로 바꾸기 

→ 디코딩 20번 

→ 그 결과값이 decode_id와 decode_pw에 저장

→  decode_id와 decode_pw 이 "admin"이면 문제가 풀림


문제를 풀리게 하기 위해 거꾸로 생각해보면 


마지막 decode_id와 decode_pw에 저장된 값이 "admin" 

→ 인코딩 20번

→ 숫자를 특수문자로 바꾸기

→ 그 결과값은 decode_id와 decode_pw에 저장되어 있었던 값

→  decode_id와 decode_pw에 저장되어 있었던 값은  "user"쿠키값과 "password"쿠키값 


즉, "user"쿠키값과 "password"쿠키값에 "admin"이라는 문자열을 20번 인코딩하고 숫자를 해당 특수문자로 바꾼 결과값이 들어가야 

index.phps파일이 실행되어 변수 decode_id와 decode_pw에 마지막으로 저장되있는 값이 "admin"이 된다 !!


① "admin"을 20번 인코딩하기 

webhacking.kr의 메인페이지에 변환해주는 기능이 있어서 그걸 이용하였다.

->base64 버튼은 20번 누르면 

(너-무 길어서 부분만 보여줌)


② 1부터 8까지의 숫자를 해당 특수문자로 바꾸기

개발자 도구의 콘솔창을 사용하여 해결하였다.


 


③ 문제페이지의 "user"와 "password" 쿠키값에 이번에서 나온 결과값으로 바꾸고 새로고침하기 


그러면 문제페이지에 출력되는 ID와 PW값이 바뀌는걸 확인할 수 있다!



동시에 



Clear !!!


[참고]

 base64 인코딩 & 디코딩 

base64란 8비트 이진 데이터를 문자코드에 영향을 받지 않는 공통ASCII 영역의 문자들로만 이루어진 문자열로 바꾸는 인코딩 방식을 가리키는 개념이다. 인코딩된 문자열은 A-Z, a-z, 0-9 그리고 + 와 / 로 총 64개로 이루어지며, = 는 끝을 알리는 코드로 쓰인다. 

1. Base64 인코딩 : 파라미터 = byte[] , 리턴유형 = String

2. Base64 디코딩 : 파라미터 = String , 리턴유형 = byte[] 

- @solve(6,100);  는 solve( )함수를 호출한다는 뜻으로 이 때 골뱅이(at)를 붙이면 에러가 나더라도 에러내용이 출력되지 않는다.


[질문]

1. @solve(6,100)에서 함수 안에 있는 숫자들은 무슨 의미인가요?.? 

2. php코드에서 echo( )는 문자열을 출력해주는 함수라고 알고 있는데, 왜 echo("<meta http-equiv=refresh content=0>");   또는 코드 78번째처럼 인자로 들어간 문자열은 출력하지 않죠 ?.?

'웹해킹 > [webhacking.kr] ' 카테고리의 다른 글

[webhacking.kr] challenges1  (0) 2017.10.23
[webhacking.kr] challenges4  (0) 2017.10.23
[webhacking.kr] challenges54  (0) 2017.10.16
[webhacking.kr] challenges20  (0) 2017.10.16
[webhacking.kr] challenges10  (0) 2017.10.13