[WARGAME][webhacking.kr] old-6

jckim22·2022년 11월 15일
0

[WEBHACKING] STUDY (WARGAME)

목록 보기
70/114

이번 문제는 10점짜리라서 그런지 굉장히 쉽게 풀렸다.

아래는 서버 코드이다.

<?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;
}
?>
<html>
<head>
<title>Challenge 6</title>
<style type="text/css">
body { background:black; color:white; font-size:10pt; }
</style>
</head>
<body>
<?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);
}
?>
</body>
</html>

코드를 차근차근 해석하면 cookie세팅이 되어있지 않을 때 쿠키에 user에는 guest, pw에는 123qwe를 20번 base_64로 인코딩하고 그 안에 여러 숫자들을 각정 특수문자로 치환한 값을 담는다.

그리고 그 밑에서 다시 역순으로 디코딩해 화면에 원문을 출력하는 내용이다.
마지막으로 원문의 아이디가 admin이고 비밀번호가 nimda라면 flag를 준다는 내용이 있다.

그럼 아래를 보자.

먼저 메인 화면에 원문인 guset의 정보가 있다.
물론 쿠키에는 이 값이 인코딩된 값이 있을 것이다.
그리고 그 쿠키에 값을 다시 디코딩한 값이 지금 내가 보고 있는 화면에 원문이다.

그럼 내가 해야할 것은 어차피 다시 디코딩을 해주기 때문에 그 디코딩 한 값을 admin과 nimda로 만들어줘야 한다.

디코딩은 쿠키에서 가져오는 것이기 때문에 쿠키에 admin과 nimda를 20번 인코딩하고 치환한 값을 넣어주면 될 것 같다.

그래서 따로 파이썬 코드를 짤 필요도 없이 서버의 코드를 그대로 가져와 나의 로컬 서버에서 admin으로 바꾸기만 하고 돌려보았다.

아래는 그 코드이다.

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <?php
    $val_id = "admin";
    $val_pw = "nimda";
    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);

    echo $val_id;

    ?>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    
    <?= $val_pw;
    ?>
</body>

</html>

그리고 직접 그 파일에 들어가 출력 내용을 확인한 것이 아래이다.

위처럼 긴 인코딩과 치환을 거친 암호문이 있는 것을 볼 수 있다.
위쪽은 id이고 밑은 pw이다.

그럼 이 값을 아래처럼 쿠키의 value로 넣어준다.

그럼 아래와 같이 성공적으로 flag를 얻을 수 있다.

profile
개발/보안

0개의 댓글