Web Hacking/webhacking.kr 풀이

old-06 write-up

박연준 2024. 1. 10. 23:11

문제 정보

https://webhacking.kr/challenge/web-06/

 

https://webhacking.kr/challenge/web-06/

 

webhacking.kr

 

 

풀이

문제 접속하면 ID와 PW를 알려주고 소스 코드를 볼 수 있도록 되어있다.

 

 

제공된 소스코드는 다음과 같다. 소스 코드를 전체적으로 분석해보면 가장 먼저 user이라는 쿠키가 없다면 다음과 같이 id와 pw를 제공받아 base64로 인코딩한 후, 1부터8을 특수기호로 치환한다. 그리고 이 값을 쿠키에 저장하고 index 페이지에 보이는 ID와 PW의 값은 이를 다시 디코딩하여 보여주는 문자열이다. 이를 ID가 admin이고 PW가 nimda이면 solve할 수 있다.

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

 

 

 

ID와 PW를 admin과 nimda로 맞춰서 쿠키 값을 수정하면 해결될 것 같다. 쿠키 값을 확인해보니 엄청 길다... 

 

 

파이썬으로 id와 pw의 값을 admin과 nimda로 수정하고 위 php 코드와 동일하게 작성하면 다음과 같이 위에 보이는 쿠키 값과 비슷하게 나오는 것을 확인할 수 있다.

import base64

id = "admin"
pw = "nidma"

id = id.encode('ascii')
pw = pw.encode('ascii')

for i in range(0, 20):
    id = base64.b64encode(id)
    pw = base64.b64encode(pw)

id = id.decode('ascii')
pw = pw.decode('ascii')

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 + "\n")
print(pw)

 

 

위와 같이 소스 코드를 작성하고 파이썬 코드를 실행시키면 아래와 같이 쿠키 값이 잘 나온다.

 

 

f12를 눌러 개발자 도구에서 Application에서 쿠키를 수정해도 되지만 조금 더 편하게 크롬 확장 프로그램인 EditThisCookie를 이용해서 값을 복사해서 옮겨주었다.

 

 

새로고침 해보니 아무것도 안뜨길래 당황했는데 PW가 nimda이어야 하는데 nidma로 오타가 났다..

 

 

다시 파이썬 작성 부분에서 pw의 문자열 부분을 수정해주고, 쿠키 값을 다시 붙여준 후 f5로 새로고침하여 해결하였다.

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

old-19 write-up  (0) 2024.01.11
old-32 write-up  (0) 2024.01.10
old39 write-up  (0) 2024.01.10
old-38 write-up  (0) 2024.01.10
old-24 write-up  (0) 2024.01.10