아이디어가 참신한 문제.
<?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()
를 사용하는 것 같았다.