본문 바로가기
Write Up/webhacking.kr_old

Webhacking.kr Challenge(old)_6번문제

by 비원(Be one) 2020. 5. 3.
반응형

여러분 안녕하세요. 세이버입니다.

 

이번 시간에는 Webhacking.kr Challenge old 6번 문제를 풀어보도록 하겠습니다.

 

6번 문제는 과거의 문제와 비슷한 유형이니 기존의 강의를 보고 오시길 추천드립니다.

Webhacking.kr 문제풀이_Part6_5번 문제 : https://poci.tistory.com/59

 

Webhacking.kr 문제풀이_Part7_6번 문제

여러분 안녕하세요. POCI입니다. 이번 시간에는 Webhacking.kr의 6번 문제를 풀어보도록 하겠습니다. 1. 사이트 둘러보기 6번 문제에 들어가면 ID와 PW가 나오고, HINT : base64라는 문구가 나옵니다. 노란색으..

poci.tistory.com


1. 문제 파악하기

6번 문제를 클릭해봅시다.

 

옆에 코드 아이콘이 있는 걸로 보아 코드를 해석하는 문제일 거 같습니다.

 

6번 문제를 클릭하면 ID와 PW가 적힌 페이지가 나옵니다.

 

view-source는 클릭할 수 있도록 되어있습니다.

클릭하면 php와 html으로 이루어진 창이 나옵니다.

 

 

창 하단에 있는

if($decode_id=="admin" && $decode_pw=="nimda"){
  solve(6);

}

이 부분이 키워드 인거 같습니다.

 

 

2. php 해석하기

php 코드만 따로 보겠습니다. 먼저 윗부분의 코드부터 보겠습니다.

 

<?php
include "../../config.php";
if($_GET['view_source']) view_source();
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,time()+86400,"/challenge/web-06/");
  Setcookie("password",$val_pw,time()+86400,"/challenge/web-06/");
  echo("<meta http-equiv=refresh content=0>");
  exit;
}
?>

 

여기서

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);
  }

이 코드를 해석하면

"쿠킷값이 user이면 val_id와 val_pw에 각각 guest, 123qwe를 넣고, Base64 인코딩을 20번 한다."입니다.

 

Base64에 대한 설명은 아래 링크에서 보실 수 있습니다.

Base64 인코딩 : https://poci.tistory.com/56

 

Base64 인코딩

1. Base64 인코딩이란?? Base 64은 64진법이라는 뜻입니다. 64는 2의 6 제곱(2^6)으로, 2의 제곱수 중 화면에 표시되는 ASCII 문자들의 개수입니다. 0부터 63까지 각각 문자를 지정해준 후, 그에 맞게 문자를 치환..

poci.tistory.com

$val_id=str_replace("1","!",$val_id);
$val_id=str_replace("2","@",$val_id);
...
$val_pw=str_replace("8",")",$val_pw);

이 분에서 Base64로 20번 인코딩 된 val_id, val_pw의 값의 1~8이 특수문자로 치환됩니다.

 

Setcookie("user",$val_id,time()+86400,"/challenge/web-06/");
Setcookie("password",$val_pw,time()+86400,"/challenge/web-06/");

그리고 변환된 val_id,val_pw을 쿠킷값으로 지정합니다.

 

그래서 쿠킷값을 확인해보면 난잡한 문자열로 이루어진 걸 볼 수 있습니다.

 

 

아랫부분의 php 코드도 살펴보겠습니다.

 

<?php
$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("<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"){
  solve(6);
}
?>

$decode_id=$_COOKIE['user'];
$decode_pw=$_COOKIE['password'];

이 부분에서 user와 password의 쿠킷값을 decode_id, decode_pw에 대입합니다.

 

$decode_id=str_replace("!","1",$decode_id);
$decode_id=str_replace("@","2",$decode_id);
...
$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
);
}

 

그런 다음 decode_id와 decode_pw에 있는 특수문자를 1~8로 치환하고, Base64 디코딩을 20번 진행합니다. 

 

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

디코딩된 값을 각각 ID와 PW에 출력되도록 합니다.

 

 

if($decode_id=="admin" && $decode_pw=="nimda"){
  solve(6);
}

만약 decode_id의 값이 "admin"이고, decode_pw의 값이 "nimda"이면 해결됩니다.

 

즉, admin과 nimda를 Base64 인코딩을 20번 한 다음 숫자를 특수문자로 치환시킨 후 쿠킷값에 넣으면 해결되는 문제임을 알 수 있습니다.

 

 

3. Base64 인코딩 하기

인코딩하는 방법은 두 가지가 있습니다.

 

https://www.convertstring.com/ko/EncodeDecode/Base64Encode 같은 인코딩 사이트를 이용하는 방법이 있고,

파이썬으로 인코딩을 하는 코드를 만드는 방법도 있습니다.

 

저는 사이트에서 20번씩 일일이 클릭하는 게 귀찮아서 파이썬 코드로 인코딩했습니다.

여러분들도 파이썬으로 코딩해서 해보시는 걸 추천드립니다.

 

인코딩을 20번 해준 후 숫자를 특수기호를 바꾸는 것도 일일이 하기 힘드니까 한글파일에 있는 문자 바꾸기 기능을 사용하시거나, 파이썬 코드로 바꾸는 방법이 있습니다.

 

저는 이것도 귀찮아서 파이썬 코드로 했습니다.

 

인코딩하고, 특수문자로 치환된 값을 user, password 쿠킷값에 넣습니다.

 

그리고 새로고침을 하면 풀렸다는 메세지가 뜹니다.

 


 

이번 강의는 여기까지입니다.

php 코드를 해석하고 쿠킷값만 바꿔주면 되는 간단한 문제였습니다.

 

오늘도 수고하셨습니다.

 


정리

- php 코드 해석

- 해석한 대로 쿠킷값을 변조해서 대입


강의가 유익하셨거나 마음에 드셨으면 구독과 좋아요, 댓글 부탁드립니다.

궁금하신 점이나 질문은 댓글이나 메일 남겨주세요.

 

poci5003@gmail.com

반응형