본문 바로가기

보안공부/Webhacking.kr 풀이

webhacking.kr 6번 문제 풀이 - 감싸고바꾸고

오늘은 webhacking.kr 6번 문제를 풀어보자.

6번 문제에 들어가면 다음과 같은 화면이 반겨줄것이다.

index.phps를 눌러 이 페이지의 코드를 보면 다음과 같이 나온다.

<?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> 

그럼 이제 코드를 분석해볼까요?


[실행 조건 : !$_COOKIE[user]]

user 쿠키가 존재하지 않을때 실행되는 조건문


$val_id에 guest, $val_pw에 123qwe라는 값을 넣어줍니다.

$val_id="guest"; 
$val_pw="123qwe";

$val_id값과 $val_pw값을 base64로 19번 인코딩합니다.

for($i=0;$i<20;$i++)
{ 
     $val_id=base64_encode($val_id);
     $val_pw=base64_encode($val_pw);
} 

$val_id값과 $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); 

user라는 쿠키에 $val_id, password라는 쿠키에 $val_pw에 해당하는 값을 대입해줍니다.

Setcookie("user",$val_id); 
Setcookie("password",$val_pw);

메타태그를 이용하여 즉시 새로고침합니다.

echo("<meta http-equiv=refresh content=0>"); 

문제 해결을 위한 조건이 충족되었을 때 실행


 

user라는 쿠키값을 $decode_id의 값으로, password라는 쿠키값을 $decode_pw의 값으로 설정해준다.

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

치환 암호화된 $val_id값과 $val_pw값을 복호화합니다.

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

Base64로 19번 디코드합니다.

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

만약 $decode_id값과 $decode_pw값이 admin이라면 문제를 해결한다.

if($decode_id=="admin" && $decode_pw=="admin") 
{
    @solve(6,100);
}

위에서 코드를 분석할때 봤던것과 같이 user와 password 쿠키가 생성되어 있습니다.

 

 

그럼 이제 이 문제를 해결하기 위해서는 저 값을 복호화한 값이 admin이 되게 해야하므로, 

 

우리가 직접 암호문을 만들어줍시다.

 

직접 만들기는 귀찮으니 이 값을 알려줄 코드를 작성해봅시다.

<?php
  $ADMIN = 'admin';
  for($i=0;$i<20;$i++){
      $ADMIN=base64_encode($ADMIN);
  }
  $ADMIN=str_replace("1","!",$ADMIN);
  $ADMIN=str_replace("2","@",$ADMIN);
  $ADMIN=str_replace("3","$",$ADMIN);
  $ADMIN=str_replace("4","^",$ADMIN);
  $ADMIN=str_replace("5","&",$ADMIN);
  $ADMIN=str_replace("6","*",$ADMIN);
  $ADMIN=str_replace("7","(",$ADMIN);
  $ADMIN=str_replace("8",")",$ADMIN);
  echo $ADMIN;
?>

 

잠깐 Tip

저 코드는 http://www.writephponline.com/같은 웹 컴파일러를 통해서도 결과를 받을 수 있다.

 

저 코드를 실행하면 다음과 같은 결과가 나온다.

 

이제 이 암호문을 user와 password 쿠키값에 넣고 실행해보자.

 

ID값과 PW값이 admin으로 변경되며

 

문제가 해결된다.

 

 



WARGAME.KR 6번 문제 클리어!