Loading [MathJax]/jax/output/CommonHTML/jax.js
본문 바로가기

Webhacking.kr

[Webhacking.kr] Challenge 6

이번 문제는 조금 어려웠다..

 

한번 같이 풀어보자

 

Challenge 6

 

문제에 들어가보니 view-source 와 ID, PW가 보인다(원래는 ID : guest , PW : 123qwe)

 

우리가 할 수 있는건 소스코드를 보는것밖에 없으니 한번 눌러보자

 

 

 

헐..(밑에 잘림)

 

뭔가 복잡해보인다...

 

일단 소스코드를 가져와보겠다..

더보기
<?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>

(너무 길어 편의상 접어놓겠다.)

 

복잡해보이지만 포기란 없다!

 

일단 차근차근 살펴보자

 

if(!$_COOKIE['user']){
  $val_id="guest";
  $val_pw="123qwe";

 

 

이 코드는 user 쿠키가 없으면 변수를 만드는것 같은데..

 

잠깐.. 쿠키..?

 

한번 쿠키를 살펴보자

 

 

오호라..

 

쿠키가 있는걸 보아 이를 변조하여 푸는 문제임을 추측할 수 있다.(아님 말고)

 

일단 계속해서

 

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

 

for은 반복문이다. 무엇을 반복하나 보니

 

변수 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);

 

흠..

 

이 코드는 변수에 담긴 문자들을 바꾸는 것 같다(ex.1 --> !)

 

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

 

이부분은 쿠키를 설정하는것 같다.

 

흠..

 

일단 지금까지 알아낸것은

 

guest와 123qwe를 변수에 저장해

 

인코딩을 20번정도 한 뒤

 

문자열 몇개를 바꾸어 쿠키로 저장하는것 같다.

 

아래로 계속 읽어보자면 

 

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

 

보면 위에 나온 코드진행과 반대임을 알 수 있다!(아마 인코딩한걸 푸는것같다.)

 

그런데 마지막 줄을 살펴보면..

 

decodeid==admin,decode_pw == nimde ??

 

분명 처음에 이름은 guest이고 패스워드는 123qwe였는데?

 

흠...

 

그렇다면 처음 부분에 있는 id 와 pw를 admin이랑 nimda로 바꾸면 해결될것같다!

 

하지만 어떻게 바꿔야하지..

 

 

소스코드에서 바로 바꿀수 있지 않을까 싶었지만

 

역시 새로고침 하니까 초기화된다..

 

그렇게 생각하던 와중

 

내가 저 코드를 직접 실행시킬 수 없을까? 라는 생각을 하게되었다!

 

https://onlinephp.io/

 

PHP Sandbox - Execute PHP code online through your browser

 

onlinephp.io

 

이 사이트에서 직접 실행시킬 수 있으니 바로 복사해 붙여넣어보려는데

 

 

생각해보니 저렇게 그대로 작성하면 어떻게 값이 나오는지 알 수 없다..

 

그러니 변수를 호출해보자

 

호출방법 : echo or print(파이썬?)

 

(줄바꿔서 호출하는 방법을 모르겠어서 하나씩함.. 혹시 아시는분은 댓글 달아주세요..)

 

이제 위에 있는 guest 부분을 admin으로 고치면 해결될것같다!

 

그렇게 고쳐서 나온 값을 쿠키값에 넣게 된다면

 

 

이렇게 해결되는것을 알 수 있다.

 

문제 해결:)

 

더보기

+

처음 풀때 쿠키값에 저 값을 그대로 넣었더니 빨간색이 뜨면서 풀리지 않았다..

 

왜인가 보니 쿠키값에는 원래 %40 같은 url 인코딩된 값이 들어가는데 위에서 나온 값은 특수문자를 그대로 출력하여 차이가 났던것이다. 

 

이를 해결하려면 

이런식으로 코드를 작성하여 출력하면 된다.(챗지피티의 힘을 조금 빌림..)

 

물론 다시 풀때 쿠키값을 넣었더니 잘 작동된다..

 


 

오늘 문제는 좀 어려웠지만 자세히 분석해보니 풀만했다!

 

혹시 글 쓰면서 틀린 부분이 있으면 댓글 달아주세요(지적은 언제나 환영)

 

 

"할 수 있다고 생각하면 할 수 있고, 할 수 없다고 생각하면 할 수 없다." - 헨리포드

'Webhacking.kr' 카테고리의 다른 글

[Webhacking.kr] Challenge 12  (0) 2024.10.10
[Webhacking.kr] Challenge 26  (0) 2024.10.08
[Webhacking.kr] Challenge 17  (0) 2024.10.06
[Webhacking.kr] Challenge 16  (0) 2024.10.06
[Webhacking.kr] Challenge 14  (0) 2024.10.05