일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- dplyr
- 대칭형 알고리즘
- filter()
- sample_n()
- samp;e_frac()
- groupe_by()
- summarize()
- mutate()
- AES
- arrange()
- select()
- distinct()
- proc contents
- Today
- Total
Gae Ko's Blog
[webhacking.kr] challenges6 본문
문제를 보니
힌트는 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> HINT : base64 </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> |
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 |