세번째 문제_goblin
<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(preg_match('/prob|_|\.|\(\)/i', $_GET[no])) exit("No Hack ~_~");
if(preg_match('/\'|\"|\`/i', $_GET[no])) exit("No Quotes ~_~");
$query = "select id from prob_goblin where id='guest' and no={$_GET[no]}";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if($result['id']) echo "<h2>Hello {$result[id]}</h2>";
if($result['id'] == 'admin') solve("goblin");
highlight_file(__FILE__);
?>
음 이번 문제를 보면 식별과 인증을 동시에 하고 있긴 한데, id 값은 'guest'로 고정이 되어 있다.
아래 첫번째 if, echo문을 보면 guest에 맞는 no 값에 맞는 숫자를 입력하면 "Hello guest"라고 나오는 것 같고
id가 admin일 경우 "goblin"이 출력되는 것으로 보인다.
내가 건드릴 수 있는 값은 no 뿐인 듯 하다, 무작정 ?no=1 이라고 넣어봤더니 아래와 같이 나온다.
id='guest' 의 no값은 1인 것 같고, id='admin'의 no은 다른 값인데,
단순히 no값만 입력하면 쿼리상 id와 and연산자로 묶여있어서 죄다 거짓이 돼서 아무것도 출력이 안 된다.

쿼리문을 보면
where id='guest' and no=''
이런 형태인데, 논리 연산자 'and'가 'or' 보다 우선하기에 no값에 guest의 no값인 1이 아닌 다른값을 넣어서
id='guest'까지 틀린 문장으로 만들고
그 뒤에 'or' 연산자를 사용해 내가 원하는 no값을 넣어 보겠다.(2,3,4,5,6) 뭔진 몰라도 다넣어봐
?no=0 or no=2
얻어 걸린건가? admin의 no 값은 2였다.
결과적으로 "where id='guest' and no=0 or no=2" 가 실행된 것인데
guest no값은 1이므로 or문 이전까지는 틀린 문장이 되고 or 뒤의 no=2가 출력된 것이다.

'LoSi' 카테고리의 다른 글
6_LoSi_darkelf (0) | 2022.11.23 |
---|---|
5_LoSi_wolfman with whitespace 우회 (0) | 2022.11.23 |
4_LoSi_orc with addslashes() / substr() (1) | 2022.11.23 |
2_LoSi_cobolt (0) | 2022.11.22 |
1_LoSi_gremlin (0) | 2022.11.22 |