LoSi

3_LoSi_goblin

duduranran 2022. 11. 22. 23:03

세번째 문제_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연산자로 묶여있어서 죄다 거짓이 돼서 아무것도 출력이 안 된다.

 

?no=1

쿼리문을 보면

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가 출력된 것이다.

 

goblin

'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