yehey's 공부 노트 \n ο(=•ω<=)ρ⌒☆

challenge (old-6) 본문

wargame 풀이/webhacking.kr

challenge (old-6)

yehey 2021. 1. 19. 21:55

6번 풀이

소스 코드를 먼저 확인해보자

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

소스 코드가 매우 길지만 두 부분으로 나누어서 확인해보자!

우선 첫번째 php 구간을 확인해보면 user 쿠키값이 없을 때 조건문이 실행된다.

id와 pw를 각각 20번씩 base64로 encoding 해주고 1~8까지 숫자를 문자로 치환해주는 과정을 거쳐서 user, password 쿠키에 값을 저장한다.

두번째 php 구간user, password 쿠키 값을 가져와서 1~8에 해당하는 문자를 숫자로 되돌려주고 치환된 값을 base64로 20번 decode 해준다.

이렇게 얻은 id값이 admin, pw값이 nimda 라면 6번문제가 해결된다!

 

그럼 id가 admin, pw가 nimda 라고 가정하고 각 값에 해당하는 쿠키 값을 생성해보자

첫번째 php 구간의 과정을 id에 admin, pw에 nimda를 대입해서 실행하면 쿠키값을 얻을 수 있을 것이다!

해당 페이지에서 과정을 진행하는 것 보다 php코드를 실행하는 사이트나 파이썬 코드를 작성해서 쿠키 값을 얻는게 더 간단할 것이라고 생각해서 파이썬으로 작성해보았다!

import base64
import sys
#id와 pw 값 지정
_id='admin'
_pw='nimda'

#utf-8로 encode (base64 encode 진행을 위해)
_id=_id.encode('utf-8')
_pw=_pw.encode('utf-8')

i=0

for i in range(20):
    _id=base64.b64encode(_id)
    _pw=base64.b64encode(_pw)

#utf-8 decode
_id=_id.decode()
_pw=_pw.decode()

_id.replace('1','!')
_id.replace('2','@')
_id.replace('3','$')
_id.replace('4','^')
_id.replace('5','&')
_id.replace('6','*')
_id.replace('7','(')
_id.replace('8',')')

_pw.replace('1','!')
_pw.replace('2','@')
_pw.replace('3','$')
_pw.replace('4','^')
_pw.replace('5','&')
_pw.replace('6','*')
_pw.replace('7','(')
_pw.replace('8',')')

#쿠키 값 출력
print('id:',_id)
print('pw:',_pw)

 코드를 실행해보면 다음과 같은 쿠키가 출력된다.

 

이제 얻은 쿠키 값을 EditThisCookie 라는 크롬 확장 프로그램을 통해 변경해서 새로고침하면 6번 문제가 해결된다.

 

'wargame 풀이 > webhacking.kr' 카테고리의 다른 글

challenge (old25)  (0) 2021.01.21
challenge (old-42)  (0) 2021.01.19
challenge (old-45)  (0) 2021.01.15
challenge (old-44)  (0) 2021.01.14
challenge (old-18)  (0) 2020.10.17
Comments