아이디어가 참신한 문제.

<?php
  include "./config.php";
  login_chk();
  $db = dbconnect();
  if(preg_match('/admin|and|or|if|coalesce|case|_|\\.|prob|time/i', $_GET['no'])) exit("No Hack ~_~");
  $query = "select id from prob_alien where no={$_GET[no]}";
  echo "<hr>query : <strong>{$query}</strong><hr><br>";
  $query2 = "select id from prob_alien where no='{$_GET[no]}'";
  echo "<hr>query2 : <strong>{$query2}</strong><hr><br>";
  if($_GET['no']){
    $r = mysqli_fetch_array(mysqli_query($db,$query));
    if($r['id'] !== "admin") exit("sandbox1");
    $r = mysqli_fetch_array(mysqli_query($db,$query));
    if($r['id'] === "admin") exit("sandbox2");
    $r = mysqli_fetch_array(mysqli_query($db,$query2));
    if($r['id'] === "admin") exit("sandbox");
    $r = mysqli_fetch_array(mysqli_query($db,$query2));
    if($r['id'] === "admin") solve("alien");
  }
  highlight_file(__FILE__);
?>

no 파라미터는 ' 를 필요하기도 하고, 필요하지 않기도 한다.

id는 admin 이기도 하고, 아니기도 하다.


우선, no를 우회하는 방법은 다음과 같다.

no = #'%0a union select ..

#을 먼저 배치하고, 그 다음에 '를 두어, 싱글쿼터 여부에 관계 없이 우회가 가능하도록 하였다.

# 은 싱글 라인에 대한 주석이므로, %0a를 통해 다음 줄로 넘어가도록 했다.


write-up을 통해서 힌트를 봤는데, now()를 사용하는 것 같았다.