HyeM

[Webhacking.kr] 6번문제 본문

Wargame/Web Hacking

[Webhacking.kr] 6번문제

Hailey_HyeM207 2020. 2. 17. 01:58

오늘의 문제는 6번!


1. 웹페이지와 소스코드

우선 6번 문제에 들어가 보자.

Webhacking.kr 6번문제_[처음화면]
Webhacking.kr 6번문제_[처음화면의 소스코드]

view_source로 들어가보면 , 다음과 같은 코드를 확인 가능하다. 

코드보려면 밑에 클릭!

 


2.  소스코드 분석

문제를 풀기 위해서, 위의 view-source의 네모상자 안의 코드만 해석해본다.

if(!$_COOKIE['user']){	//'user'라는 이름의 쿠키가 없으면,
  $val_id="guest";	//변수 'val_id'의 값은 guest
  $val_pw="123qwe";	// val_pw의 값은 123qwe로 설정한다.
  for($i=0;$i<20;$i++){	//반복문을 20번돌며,
    $val_id=base64_encode($val_id);    //val_id에 val_id를 base64로 인코딩하여 저장한다.
    $val_pw=base64_encode($val_pw);		//val_pw도 마찬가지
  }
  // str_replace함수를 이용하여 1~8의 숫자를 각각 다른 문자로 바꾸어준다. 
  $val_id=str_replace("1","!",$val_id);		//:val_id의 1을 !로 바꿈  1=> !
 val_id=str_replace("2","@",$val_id);			   // 2=> @
  $val_id=str_replace("3","$",$val_id);			   // 3=> $
  $val_id=str_replace("4","^",$val_id);			   // 4=> ^
  $val_id=str_replace("5","&",$val_id);			   // 5=> &
  $val_id=str_replace("6","*",$val_id);			   // 6=> *
  $val_id=str_replace("7","(",$val_id);			   // 7=> (
  $val_id=str_replace("8",")",$val_id);			   // 8=> )

  $val_pw=str_replace("1","!",$val_pw);   	//:val_pw의 1을 !로 바꿈 1=> !	
  $val_pw=str_replace("2","@",$val_pw);			   // 2=> @	    
  $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,time()+86400,"/challenge/web-06/");
  Setcookie("password",$val_pw,time()+86400,"/challenge/web-06/");
  // /challenge/web-06/의 경로에서 쿠키이름을 각각 user, password로 지정 후, 위에서 바꿔준 val_id와 val_pw의 값을 각각 넣어준다. 그리고 쿠키의 만료시간은 초단위로 86400초로 지정해주었다
  echo("<meta http-equiv=refresh content=0>");
  // (0초뒤에) 현재 페이지로 이동
  
  exit;
}

* 문법정리

●  Base64_encode( ) : base64로 인코딩

      Base64_encode( 인코딩할 문자 )

# base64 :

8비트 이진 데이터를 문자 코드에 영향을 받지 않은 공통 ASC|| 영역의 문자들로만 이루어진 일련의 문자열로 바꾸는 인코딩 방식을 가리키는 개념이다.

 

  Str_replace( ) : 문자 바꾸기 (치환)

      Base64_encode( 변경대상문자, 변경하려는 문자, 변수(replace가 바꾸고자 하는 문자열 ) )

 

 

  Setcookie( ) : 쿠키 사용하기

      setcookie (쿠키명, 쿠키값, 만료시간, 경로, 도메인, 보안, httponly);

-         도메인 : 사용될 도메인을 지정가능함,.서브도메인 입력시 해당 서브도메인만 사용가능

-         보안 : 보안 프로토콜인 https에서만 사용가능하도록 설정함

-         Httponly : HTTP에서만 사용가능하도록 하여 스크립트에 의한 쿠키 접근을 허용안하게 함.

 

<meta http-equiv=” “ content= ; url = ”>     :  meta태그로  간단하게 페이지 넘겨주기

      <meta http-equiv=”refresh” content”시간(초단위); url= 이동하고자 하는 웹페이지나 미디어주소”>

 

$decode_id=$_COOKIE['user'];			// decode_ id에 user 쿠키값을 넣어준다.
$decode_pw=$_COOKIE['password'];		// decode_pw에 password 쿠키값을 넣어준다.

$decode_id=str_replace("!","1",$decode_id);	 // decode_id의 !를 1로 바꾸어준다.
$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의 !를 1로 바꾸어준다.
$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);

/*
즉, “ 위에서 인코딩 20번하고 바꾸기 작업(1~8 => 특수문자)  한 값 ” = 쿠키값	을
 받아와, 복구 시켜주기 위해
“ 바꾸기작업 하고 디코딩 20번”을 해준다.
*/



for($i=0;$i<20;$i++){		// 20번동안 for문을 돌며 decode_id와
  $decode_id=base64_decode($decode_id);
  $decode_pw=base64_decode($decode_pw);	  // decode_pw의 값을 base64로 디코딩한다
}

echo("<hr><a href=./?view_source=1 style=color:yellow;>view-source</a><br><br>");
echo("ID : $decode_id<br>PW : $decode_pw<hr>");

if($decode_id=="admin" && $decode_pw=="nimda"){  //만약 decode_id와 decode_pw를 디코딩한 값이 admin과 nimda라면 성공이다.
  solve(6);
}
?>

 


3. 풀이방법

[ 코드 정리 ]

user라는 이름의 쿠키값이 없으면, {

                 id를 guest로 pw를 123qwe로 지정해주고,

                 idpw를 base64로 인코딩20번 반복한다.

                 그 후엔,  id와 pw의 1~8의 값을 특수문자로 바꾸어주고

                 그 값을 각각 user와 password의 이름의 쿠키로 설정해준다.

 }

쿠키값 user와 password를 변수로 저장하여

                 특수문자를 1~8로 바꾸어준 후

                 Base64로 디코딩을 20번 반복한다.

                 만약{

                                 Id가 admin이고, pw가 nimda이면 문제는 해결이다.

}

 

 

[ 풀이계획 ] 

Cooxie 툴을 이용하여, user와 password 값을

Admin과 nimda로 하고,

Base64인코딩 20번 돌려

이 중 1~8의 값을 특수문자로 바꾼다.

 

     =>  인코딩하여 특수문자로 바꾸는 것을 하나하나 하는 것은 어려우므로, 

php코드를 짜서 해결한다.

 

 


4. 풀이

1) php언어로 코드짜기

Webhacking.kr 6번문제_[따로 만든 페이지소스]

위의 코드를 페이지화면에 띄우면, 첫째줄은 val_id의 값, 두번째줄은 val_pw값이 나온다.

Webhacking.kr 6번문제_[위에서 입력한 코드의 실행화면]

 

 

2) 그 결과 값을 EditThisCookie를 열어, user와 password 값에 넣어준다

Webhacking.kr 6번문제_[쿠기값수정]

 

3) 새로고침F5 하면 , 성공!

Webhacking.kr 6번문제_[성공화면]
Webhacking.kr 6번문제_[성공화면]

 


문제사이트 => https://webhacking.kr/old.php

'Wargame > Web Hacking' 카테고리의 다른 글

[Wargame.kr] QR code Puzzle  (0) 2020.03.21
[Wargame.kr] flee button 풀이  (0) 2020.03.21
[Wargame.kr] already got 풀이  (0) 2020.03.21
[Webhacking.kr] 14번문제  (0) 2020.02.24
[Webhacking.kr] 1번문제  (0) 2020.02.17
Comments